Рубрики
Без рубрики

Руководство по написанию Java

Краткое руководство по использованию API OAuth1 и OAuth2 с использованием Java Scribe.

Автор оригинала: baeldung.

1. введение

В этом уроке мы рассмотрим библиотеку Scribe Java .

Scribe Java-это простой клиент OAuth для Java, который помогает управлять потоком OAuth.

Основная особенность библиотеки заключается в том, что она поддерживает все основные API OAuth 1.0 и 2.0 “из коробки”. Более того, если нам придется работать с API, который не поддерживается, библиотека предоставляет несколько классов для реализации наших API OAuth.

Еще одна важная особенность заключается в том, что можно выбрать, какой клиент использовать. Действительно, Scribe Java поддерживает несколько HTTP-клиентов:

Кроме того, библиотека потокобезопасна и совместима с Java 7, поэтому мы можем использовать ее в устаревших средах.

2. Зависимости

Scribe Java организована в ядро и модуль API , последний включает в себя набор внешних API (Google, GitHub, Twitter и т. Д.) И артефакт ядра:


    com.github.scribejava
    scribejava-apis
    latest-version

В случае, если нам нужны только основные классы без какого-либо внешнего API, мы должны вытащить только основной модуль:


    com.github.scribejava
    scribejava-core
    latest-version

Последние версии можно найти в репозитории Maven .

3. Служба OAuth

Основной частью библиотеки является абстрактный класс OAuth Service , который содержит все параметры, необходимые для правильного управления “рукопожатием” OAuth.

В зависимости от версии протокола мы будем использовать Oauth10Service или Oauth20Service конкретные классы соответственно для OAuth 1.0 и OAuth 2.0 .

Для создания реализаций службы OAuth библиотека предоставляет конструктор служб :

OAuthService service = new ServiceBuilder("api_key")
  .apiSecret("api_secret")
  .scope("scope")
  .callback("callback")
  .build(GoogleApi20.instance());

Мы должны установить api_key и api_secret токены, предоставляемые сервером авторизации.

Кроме того, мы можем установить область запроса и обратный вызов , на который сервер авторизации должен перенаправить пользователя в конце потока авторизации.

Обратите внимание, что в зависимости от версии протокола не все параметры являются обязательными.

Наконец, мы должны создать службу OAuth , вызвав метод build() и передав ему экземпляр API, который мы хотим использовать. Мы можем найти полный список поддерживаемых API на Scribe Java GitHub .

3.1. HTTP-клиент

Кроме того, библиотека позволяет нам выбирать, какой HTTP-клиент использовать:

ServiceBuilder builder = new ServiceBuilder("api_key")
  .httpClient(new OkHttpHttpClient());

После, конечно, мы включили необходимые зависимости для предыдущего примера:


    com.github.scribejava
    scribejava-httpclient-okhttp
    latest-version

Последние версии можно найти в репозитории Maven .

3.2. Режим отладки

Кроме того, существует режим отладки, который мы можем использовать для устранения неполадок:

ServiceBuilder builder = new ServiceBuilder("api_key")
  .debug();

Нам просто нужно вызвать метод debug () . Отладка выведет в System.out некоторую соответствующую информацию.

Кроме того, если мы хотим использовать другой вывод, есть другой метод, который принимает OutputStream для отправки отладочной информации в:

FileOutputStream debugFile = new FileOutputStream("debug");

ServiceBuilder builder = new ServiceBuilder("api_key")
  .debug()
  .debugStream(debugFile);

4. Поток OAuth 1.0

Теперь давайте сосредоточимся на том, как обрабатывать поток OAuth1.

В этом примере мы собираемся получить токен доступа с помощью API Twitter, и мы будем использовать его для выполнения запроса.

Прежде всего, мы должны создать сервис Oauth 10 , как мы видели ранее, с помощью builder:

OAuth10aService service = new ServiceBuilder("api_key")
  .apiSecret("api_secret")
  .build(TwitterApi.instance());

Как только у нас будет служба OAuth 10, мы сможем получить токен запроса и использовать его для получения URL-адреса авторизации:

OAuth1RequestToken requestToken = service.getRequestToken();
String authUrl = service.getAuthorizationUrl(requestToken);

На этом этапе необходимо перенаправить пользователя на author и получить oauthVerifier , предоставленный страницей.

Следовательно, мы используем oauth_verifier для получения токена доступа :

OAuth1AccessToken accessToken = service.getAccessToken(requestToken,oauthVerifier);

Наконец, мы можем создать запрос с помощью OAuth запрашивает объект и добавляет к нему токен с помощью метода signRequest() :

OAuthRequest request = new OAuthRequest(Verb.GET, 
    "https://api.twitter.com/1.1/account/verify_credentials.json");
service.signRequest(accessToken, request);

Response response = service.execute(request);

В результате выполнения этого запроса мы получаем Ответ объект.

5. Поток OAuth 2.0

Поток OAuth 2.0 не сильно отличается от потока OAuth 1.0. Чтобы объяснить эти вариации, мы собираемся получить токен доступа с помощью API Google.

Таким же образом, как и в потоке OAuth 1.0, мы должны создать службу OAuth и получить authUrl , , но на этот раз мы будем использовать OAuth20Service экземпляр:

OAuth20Service service = new ServiceBuilder("api_key")
  .apiSecret("api_secret")
  .scope("https://www.googleapis.com/auth/userinfo.email")
  .callback("http://localhost:8080/auth")
  .build(GoogleApi20.instance());

String authUrl = service.getAuthorizationUrl();

Обратите внимание, что в этом случае нам необходимо указать область запроса и обратный вызов , с которым мы свяжемся в конце потока авторизации.

Аналогично, мы должны перенаправить пользователя на authUrl и принять параметр code в URL-адресе обратного вызова:

OAuth2AccessToken accessToken = service.getAccessToken(code);

OAuthRequest request = new OAuthRequest(Verb.GET, "https://www.googleapis.com/oauth2/v1/userinfo?alt=json");
service.signRequest(accessToken, request);

Response response = service.execute(request);

В конце концов, чтобы сделать запрос , мы получаем accessToken с помощью метода getAccessToken () .

6. Пользовательские API

Вероятно, нам придется работать с API, который не поддерживается Scribe Java. В этих обстоятельствах библиотека позволяет нам реализовывать наши собственные API .

Единственное, что нам нужно сделать, это предоставить реализацию класса Defaultapi10a или DefaultApi20 .

Давайте представим, что у нас есть сервер авторизации OAuth 2.0 с предоставлением пароля. В этом случае мы можем реализовать DefaultApi20 , чтобы мы могли взять токен доступа :

public class MyApi extends DefaultApi20 {

    public MyApi() {}

    private static class InstanceHolder {
        private static final MyApi INSTANCE = new MyApi();
    }

    public static MyApi instance() {
        return InstanceHolder.INSTANCE;
    }

    @Override
    public String getAccessTokenEndpoint() {
        return "http://localhost:8080/oauth/token";
    }

    @Override
    protected String getAuthorizationBaseUrl() {
        return null;
    }
}

Таким образом, мы можем получить токен доступа таким же образом, как и раньше:

OAuth20Service service = new ServiceBuilder("baeldung_api_key")
  .apiSecret("baeldung_api_secret")
  .scope("read write")
  .build(MyApi.instance());

OAuth2AccessToken token = service.getAccessTokenPasswordGrant(username, password);

OAuthRequest request = new OAuthRequest(Verb.GET, "http://localhost:8080/me");
service.signRequest(token, request);
Response response = service.execute(request);

7. Заключение

В этой статье мы рассмотрели наиболее полезные классы, которые Scribe Java предоставляет в готовом виде.

Мы узнали, как обрабатывать потоки OAuth 1.0 и OAuth 2.0 с помощью внешних API. Мы также узнали, как настроить библиотеку для использования наших собственных API.

Как обычно, все примеры кода, показанные в этом руководстве, доступны на GitHub .