1. 序章

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

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

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

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

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

2. 依存関係

ScribeJavaはコアとAPIモジュールに編成されており、後者には一連の外部API(Google、GitHub、Twitterなど)とコアアーティファクトが含まれています。

<dependency>
    <groupId>com.github.scribejava</groupId>
    <artifactId>scribejava-apis</artifactId>
    <version>latest-version</version>
</dependency>

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

<dependency>
    <groupId>com.github.scribejava</groupId>
    <artifactId>scribejava-core</artifactId>
    <version>latest-version</version>
</dependency>

最新バージョンはMavenリポジトリにあります。

3. OAuthService

ライブラリの主要部分は抽象クラスOAuthServiceであり、OAuthの「ハンドシェイク」を正しく管理するために必要なすべてのパラメーターが含まれています。

プロトコルのバージョンに応じて、 OAuth1.0OAuth2.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を設定できます。

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

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

3.1. HTTPクライアント

さらに、ライブラリを使用すると、使用するHTTPクライアントを選択できます。

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

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

<dependency>
    <groupId>com.github.scribejava</groupId>
    <artifactId>scribejava-httpclient-okhttp</artifactId>
    <version>latest-version</version>
</dependency>

最新バージョンは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. OAuth1.0フロー

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

この例では、 Twitter APIでアクセストークンを取得し、それを使用してリクエストを行います。

まず、ビルダーを使用して、前に見たように、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のフローは、OAuth1.0と大差ありません。 これらのバリエーションを説明するために、GoogleAPIでアクセストークンを取得します。

同様に、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();

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

同様に、ユーザーを 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 を作成するために、 getAccessToken()メソッドを使用してaccessTokenを取得します。

6. カスタムAPI

おそらく、ScribeJavaでサポートされていないAPIを使用する必要があります。 そのような状況では、ライブラリを使用して独自のAPIを実装できます。

私たちがする必要がある唯一のことは、DefaultApi10またはDefaultApi20クラスの実装を提供することです。

パスワードが付与されたOAuth2.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. 結論

この記事では、ScribeJavaが提供する最も便利なクラスを紹介しました。

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

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