ScribeJavaへのガイド

ScribeJavaのガイド

1. 前書き

このチュートリアルでは、ScribeJavaライブラリを見ていきます。

ScribeJavaは、OAuthフローの管理に役立つJava用のシンプルなOAuthクライアントです。

ライブラリの主な機能は、すべての主要な1.0および2.0 OAuth APIをそのままサポートすることです。 さらに、サポートされていないAPIを使用する必要がある場合、ライブラリにはOAuthのAPIを実装するためのクラスがいくつか用意されています。

もう1つの重要な機能は、使用するクライアントを選択できることです。 実際、ScribeJavaはいくつかのHTTPクライアントをサポートしています。

さらに、ライブラリはスレッドセーフであり、Java7と互換性があるため、レガシー環境で使用できます。

2. 依存関係

ScribeJava is organized into a core and APIs module、後者には一連の外部API(Google、GitHub、Twitterなど)とコアアーティファクトが含まれています。


    com.github.scribejava
    scribejava-apis
    latest-version

外部APIなしでコアクラスのみが必要な場合は、コアモジュールのみをプルする必要があります。


    com.github.scribejava
    scribejava-core
    latest-version

最新バージョンはMaven repositoryにあります。

3. OAuthService

The main part of the library is the abstract class OAuthServiceには、OAuthの「ハンドシェイク」を正しく管理するために必要なすべてのパラメーターが含まれています。

プロトコルのバージョンに応じて、OAuth 1.0OAuth 2.0にそれぞれOauth10ServiceまたはOauth20Service具象クラスを使用します。

OAuthServiceの実装を構築するために、ライブラリはServiceBuilder:を提供します

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

承認サーバーから提供されるapi_keyトークンとapi_secretトークンを設定する必要があります。

また、リクエストのscopeと、承認サーバーが承認フローの最後にユーザーをリダイレクトするcallbackを設定することもできます。

プロトコルのバージョンによっては、すべてのパラメーターが必須ではないことに注意してください。

最後に、build()メソッドを呼び出してOAuthServiceを作成し、使用するAPIのインスタンスを渡す必要があります。 ScribeJavaGitHubでサポートされているAPIの完全なリストを見つけることができます。

3.1. HTTPクライアント

さらに、the library allows us to choose which HTTP Client to use:

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

もちろん、前の例では、必要な依存関係を含めました。


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

最新バージョンはMaven repositoryにあります。

3.2. デバッグモード

さらに、there’s a debug mode we can use to help us troubleshooting:

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. OAuth1.0フロー

次に、OAuth1フローを処理する方法に焦点を当てましょう。

この例では、we’re going to get an access token with the Twitter APIs and we’ll use it to make a request.

まず、ビルダーを使用して、前に見たように、Oauth10Serviceをビルドする必要があります。

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

OAuth10Service, を取得したら、requestTokenを取得し、それを使用して認証URLを取得できます。

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

この時点で、ユーザーをauthUrlにリダイレクトし、ページによって提供されるoauthVerifier を取得する必要があります。

したがって、oauthVerifier を使用してaccessTokenを取得します。

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

最後に、OAuthRequestオブジェクトを使用してリクエストを作成し、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);

そのrequestを実行した結果、Responseオブジェクトを取得します。

5. OAuth2.0フロー

OAuth 2.0フローは、OAuth 1.0と大差ありません。 これらのバリエーションを説明するために、we’re going to get an access token with Google APIs.

OAuth 1.0フローで行ったのと同じ方法で、OAuthServiceをビルドして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();

この場合、リクエストのscopeと、承認フローの最後に連絡するcallbackを提供する必要があることに注意してください。

同様に、ユーザーをauthUrlにリダイレクトし、コールバックのURLでcodeパラメータを取得する必要があります。

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);

最後に、requestを作成するために、accessToken  withgetAccessToken()メソッドを取得します。

6. カスタムAPI

ScribeJavaでサポートされていないAPIを使用する必要があるでしょう。 そのような状況では、the library allows us to implement our own APIs

必要なのは、DefaultApi10またはDefaultApi20 classの実装を提供することだけです。

パスワードが付与されたOAuth2.0認証サーバーがあると想像してみてください。 この場合、access tokenを取得できるように、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("example_api_key")
  .apiSecret("example_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. 結論

この記事では、ScribeJavaがすぐに提供する最も有用なクラスを調べました。

外部APIを使用してOAuth 1.0およびOAuth 2.0フローを処理する方法を学びました。 また、独自のAPIを使用するためにライブラリを構成する方法も学びました。

いつものように、このチュートリアルに示されているすべてのコードサンプルはover on GitHubで利用できます。