ドキュメント

§Play での OpenID サポート

OpenID は、ユーザーが単一のアカウントで複数のサービスにアクセスするためのプロトコルです。Web 開発者として、OpenID を使用して、ユーザーが既に持っているアカウント(Google アカウント など)を使用してログインする方法を提供できます。企業では、OpenID を使用して会社の SSO サーバーに接続できる場合があります。

§OpenID の流れの概要

  1. ユーザーが OpenID(URL)を提供します。
  2. サーバーは URL の背後にあるコンテンツを検査して、ユーザーをリダイレクトする必要がある URL を生成します。
  3. ユーザーは OpenID プロバイダーで承認を確認し、サーバーにリダイレクトされます。
  4. サーバーはリダイレクトから情報を受け取り、プロバイダーに情報の正確性を確認します。

すべてのユーザーが同じ OpenID プロバイダーを使用している場合(たとえば、Google アカウントに完全に依存することにした場合)、ステップ 1 は省略できます。

§使用方法

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

libraryDependencies ++= Seq(
  openId
)

これで、OpenID を使用したいコントローラーまたはコンポーネントは、OpenIdClientへの依存関係を宣言する必要があります。

§Play での OpenID

OpenID API には 2 つの重要な関数があります。

§

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 で使用可能になります。

次へ: OAuth で保護されたリソースへのアクセス


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