§Play での OpenID サポート
OpenID は、ユーザーが単一のアカウントで複数のサービスにアクセスするためのプロトコルです。Web 開発者として、OpenID を使用して、ユーザーが既に持っているアカウント(Google アカウント など)を使用してログインする方法を提供できます。企業では、OpenID を使用して会社の SSO サーバーに接続できる場合があります。
§OpenID の流れの概要
- ユーザーが OpenID(URL)を提供します。
- サーバーは URL の背後にあるコンテンツを検査して、ユーザーをリダイレクトする必要がある URL を生成します。
- ユーザーは OpenID プロバイダーで承認を確認し、サーバーにリダイレクトされます。
- サーバーはリダイレクトから情報を受け取り、プロバイダーに情報の正確性を確認します。
すべてのユーザーが同じ OpenID プロバイダーを使用している場合(たとえば、Google アカウントに完全に依存することにした場合)、ステップ 1 は省略できます。
§使用方法
OpenID を使用するには、まず `build.sbt` ファイルに `openId` を追加します。
libraryDependencies ++= Seq(
openId
)
これで、OpenID を使用したいコントローラーまたはコンポーネントは、OpenIdClientへの依存関係を宣言する必要があります。
§Play での OpenID
OpenID API には 2 つの重要な関数があります。
OpenIdClient.redirectURL
は、ユーザーをリダイレクトする必要がある URL を計算します。ユーザーの OpenID ページを非同期的にフェッチすることが含まれるため、CompletionStage<String>
を返します。OpenID が無効な場合、返されたCompletionStage
は例外で完了します。OpenIdClient.verifiedId
は、現在のリクエストを検査して、検証済みの OpenID を含むユーザー情報を確立します。情報の信頼性を確認するために OpenID サーバーを非同期的に呼び出し、UserInfo のプロミスを返します。情報が正しくない場合、またはサーバーチェックが失敗した場合(たとえば、リダイレクト URL が偽造されている場合)、返されたCompletionStage
は例外で完了します。CompletionStage
が失敗した場合、フォールバックを定義できます。これにより、ユーザーをログインページにリダイレクトするか、BadRequest
を返します。
§例
conf/routes
:
GET /openID/login controllers.OpenIDController.login()
POST /openID/login controllers.OpenIDController.loginPost(request: Request)
GET /openID/callback controllers.OpenIDController.openIDCallback(request: Request)
コントローラー
package controllers;
import java.util.*;
import java.util.concurrent.CompletionStage;
import javax.inject.Inject;
import play.data.*;
import play.libs.openid.*;
import play.mvc.*;
import play.twirl.api.Html;
public class OpenIDController extends Controller {
@Inject OpenIdClient openIdClient;
@Inject FormFactory formFactory;
public Result login() {
return ok(views.html.login.render(""));
}
public CompletionStage<Result> loginPost(Http.Request request) {
// Form data
DynamicForm requestData = formFactory.form().bindFromRequest(request);
String openID = requestData.get("openID");
CompletionStage<String> redirectUrlPromise =
openIdClient.redirectURL(
openID, routes.OpenIDController.openIDCallback().absoluteURL(request));
return redirectUrlPromise
.thenApply(Controller::redirect)
.exceptionally(throwable -> badRequest(views.html.login.render(throwable.getMessage())));
}
public CompletionStage<Result> openIDCallback(Http.Request request) {
CompletionStage<UserInfo> userInfoPromise = openIdClient.verifiedId(request);
CompletionStage<Result> resultPromise =
userInfoPromise
.thenApply(userInfo -> ok(userInfo.id() + "\n" + userInfo.attributes()))
.exceptionally(
throwable -> badRequest(views.html.login.render(throwable.getMessage())));
return resultPromise;
}
public static class views {
public static class html {
public static class login {
public static Html render(String msg) {
return javaguide.ws.html.login.render(msg);
}
}
}
}
}
§拡張属性
ユーザーの OpenID は、そのアイデンティティを提供します。このプロトコルは、メールアドレス、名、または姓などの拡張属性を取得することもサポートしています。
OpenID サーバーからオプションの属性と/または必須の属性を要求できます。必須属性を要求すると、ユーザーがそれらを提供しない限り、サービスにログインできなくなります。
拡張属性は、リダイレクト URL で要求されます。
Map<String, String> attributes = new HashMap<>();
attributes.put("email", "http://schema.openid.net/contact/email");
CompletionStage<String> redirectUrlPromise =
openIdClient.redirectURL(
openID, routes.OpenIDController.openIDCallback().absoluteURL(request), attributes);
属性は、OpenID サーバーによって提供される UserInfo
で使用可能になります。
このドキュメントにエラーが見つかりましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを自由に送ってください。質問やアドバイスを共有したいですか?コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。