ドキュメント

§Play での OpenID サポート

OpenID は、ユーザーが単一のアカウントで複数のサービスにアクセスするためのプロトコルです。Web 開発者として、OpenID を使用すると、ユーザーに Google アカウントなどの既存のアカウントを使用してログインする方法を提供できます。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 への依存関係を宣言する必要があります

import javax.inject.Inject

import scala.concurrent.ExecutionContext
import scala.concurrent.Future

import play.api._
import play.api.data._
import play.api.data.Forms._
import play.api.libs.openid._
import play.api.mvc._

class IdController @Inject() (val openIdClient: OpenIdClient, c: ControllerComponents)(
    implicit val ec: ExecutionContext
) extends AbstractController(c)

OpenIdClient インスタンスを openIdClient と呼びました。以下のすべての例では、この名前が使用されていると想定しています。

§Play での OpenID

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

Future が失敗した場合、フォールバックを定義できます。フォールバックは、ユーザーをログインページにリダイレクトするか、BadRequest を返します。

使用方法の例を次に示します(コントローラーから)

def login = Action {
  Ok(views.html.login())
}

def loginPost = Action.async { implicit request =>
  Form(
    single(
      "openid" -> nonEmptyText
    )
  ).bindFromRequest()
    .fold(
      { error =>
        logger.info(s"bad request ${error.toString}")
        Future.successful(BadRequest(error.toString))
      },
      { openId =>
        openIdClient
          .redirectURL(openId, routes.Application.openIdCallback.absoluteURL())
          .map(url => Redirect(url))
          .recover { case t: Throwable => Redirect(routes.Application.login) }
      }
    )
}

def openIdCallback = Action.async { implicit request: Request[AnyContent] =>
  openIdClient
    .verifiedId(request)
    .map(info => Ok(info.id + "\n" + info.attributes))
    .recover {
      case t: Throwable =>
        // Here you should look at the error, and give feedback to the user
        Redirect(routes.Application.login)
    }
}

§拡張属性

ユーザーの OpenID は、そのユーザーの ID を示します。このプロトコルでは、メールアドレス、名、姓などの 拡張属性 を取得することもサポートされています。

OpenID サーバーから*オプション*属性または*必須*属性、あるいはその両方を要求できます。必須属性を要求すると、ユーザーがそれらを提供しない限り、サービスにログインできません。

拡張属性はリダイレクト URL で要求されます

openIdClient.redirectURL(
  openId,
  routes.Application.openIdCallback.absoluteURL(),
  Seq("email" -> "http://schema.openid.net/contact/email")
)

属性は、OpenID サーバーによって提供される UserInfo で使用できるようになります。

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


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