§OAuth
OAuthは、保護されたデータを公開および操作するための簡単な方法です。また、より安全でセキュアな方法で、ユーザーにアクセス権限を与えることができます。たとえば、Twitter上のユーザーデータにアクセスするために使用できます。
OAuthには、大きく異なる2つのバージョンがあります。OAuth 1.0とOAuth 2.0です。バージョン2は、ライブラリやヘルパーなしで簡単に実装できるほどシンプルであるため、PlayではOAuth 1.0のみをサポートしています。
§使用方法
OAuthを使用するには、まず`ws`を`build.sbt`ファイルに追加します。
libraryDependencies ++= Seq(
javaWs
)
§必要な情報
OAuthを使用するには、サービスプロバイダーにアプリケーションを登録する必要があります。提供するコールバックURLを確認してください。一致しない場合、サービスプロバイダーが呼び出しを拒否することがあります。ローカルで作業する場合は、` /etc/hosts`を使用してローカルマシンでドメインを偽装できます。
サービスプロバイダーは、以下を提供します。
- アプリケーションID
- シークレットキー
- リクエストトークンURL
- アクセストークンURL
- 承認URL
§認証フロー
フローの大部分は、Playライブラリによって処理されます。
- サーバーからリクエストトークンを取得する(サーバー間呼び出し)
- ユーザーをサービスプロバイダーにリダイレクトし、そこでユーザーがアプリケーションにデータを使用する権利を付与します。
- サービスプロバイダーはユーザーをリダイレクトし、/verifier/を提供します。
- その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との統合
このドキュメントにエラーを発見しましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを自由に送ってください。質問やアドバイスを共有したいですか?コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。