ドキュメント

§OAuth

OAuthは、保護されたデータを公開および操作するための簡単な方法です。また、より安全でセキュアな方法で、ユーザーにアクセス権限を与えることができます。たとえば、Twitter上のユーザーデータにアクセスするために使用できます。

OAuthには、大きく異なる2つのバージョンがあります。OAuth 1.0OAuth 2.0です。バージョン2は、ライブラリやヘルパーなしで簡単に実装できるほどシンプルであるため、PlayではOAuth 1.0のみをサポートしています。

§使用方法

OAuthを使用するには、まず`ws`を`build.sbt`ファイルに追加します。

libraryDependencies ++= Seq(
  javaWs
)

§必要な情報

OAuthを使用するには、サービスプロバイダーにアプリケーションを登録する必要があります。提供するコールバックURLを確認してください。一致しない場合、サービスプロバイダーが呼び出しを拒否することがあります。ローカルで作業する場合は、` /etc/hosts`を使用してローカルマシンでドメインを偽装できます。

サービスプロバイダーは、以下を提供します。

§認証フロー

フローの大部分は、Playライブラリによって処理されます。

  1. サーバーからリクエストトークンを取得する(サーバー間呼び出し)
  2. ユーザーをサービスプロバイダーにリダイレクトし、そこでユーザーがアプリケーションにデータを使用する権利を付与します。
  3. サービスプロバイダーはユーザーをリダイレクトし、/verifier/を提供します。
  4. そのverifierを使用して、/request token/を/access token/と交換します(サーバー間呼び出し)

/access token/は、保護されたデータにアクセスするためのすべての呼び出しに渡すことができます。

OAuthのプロセスフローの詳細については、The OAuth Bibleをご覧ください。

§

conf/routes:

GET     /twitter/homeTimeline controllers.Twitter.homeTimeline(request: Request)
GET     /twitter/auth         controllers.Twitter.auth(request: Request)

コントローラー

import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import javax.inject.Inject;
import play.libs.oauth.OAuth;
import play.libs.oauth.OAuth.ConsumerKey;
import play.libs.oauth.OAuth.OAuthCalculator;
import play.libs.oauth.OAuth.RequestToken;
import play.libs.oauth.OAuth.ServiceInfo;
import play.libs.ws.WSClient;
import play.mvc.Controller;
import play.mvc.Http;
import play.mvc.Result;

public class Twitter extends Controller {
  static final ConsumerKey KEY = new ConsumerKey("...", "...");

  private static final ServiceInfo SERVICE_INFO =
      new ServiceInfo(
          "https://api.twitter.com/oauth/request_token",
          "https://api.twitter.com/oauth/access_token",
          "https://api.twitter.com/oauth/authorize",
          KEY);

  private static final OAuth TWITTER = new OAuth(SERVICE_INFO);

  private final WSClient ws;

  @Inject
  public Twitter(WSClient ws) {
    this.ws = ws;
  }

  public CompletionStage<Result> homeTimeline(Http.Request request) {
    Optional<RequestToken> sessionTokenPair = getSessionTokenPair(request);
    if (sessionTokenPair.isPresent()) {
      return ws.url("https://api.twitter.com/1.1/statuses/home_timeline.json")
          .sign(new OAuthCalculator(Twitter.KEY, sessionTokenPair.get()))
          .get()
          .thenApply(result -> ok(result.asJson()));
    }
    return CompletableFuture.completedFuture(redirect(routes.Twitter.auth()));
  }

  public Result auth(Http.Request request) {
    Optional<String> verifier = request.queryString("oauth_verifier");
    Result result =
        verifier
            .filter(s -> !s.isEmpty())
            .map(
                s -> {
                  RequestToken requestToken = getSessionTokenPair(request).get();
                  RequestToken accessToken = TWITTER.retrieveAccessToken(requestToken, s);
                  return redirect(routes.Twitter.homeTimeline())
                      .addingToSession(request, "token", accessToken.token)
                      .addingToSession(request, "secret", accessToken.secret);
                })
            .orElseGet(
                () -> {
                  String url = routes.Twitter.auth().absoluteURL(request);
                  RequestToken requestToken = TWITTER.retrieveRequestToken(url);
                  return redirect(TWITTER.redirectUrl(requestToken.token))
                      .addingToSession(request, "token", requestToken.token)
                      .addingToSession(request, "secret", requestToken.secret);
                });

    return result;
  }

  private Optional<RequestToken> getSessionTokenPair(Http.Request request) {
    return request
        .session()
        .get("token")
        .map(token -> new RequestToken(token, request.session().get("secret").get()));
  }
}

**注:** OAuthはMITM攻撃に対する保護を提供しません。この例では、セッションCookieに格納されたOAuthトークンとシークレットを示しています。最高のセキュリティのために、常に`play.http.session.secure=true`を定義したHTTPSを使用してください。

**次:** Pekkoとの統合


このドキュメントにエラーを発見しましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを自由に送ってください。質問やアドバイスを共有したいですか?コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。