§Play での OpenID サポート
OpenID は、ユーザーが単一のアカウントで複数のサービスにアクセスするためのプロトコルです。Web 開発者として、OpenID を使用すると、ユーザーに Google アカウントなどの既存のアカウントを使用してログインする方法を提供できます。Google アカウント。企業では、OpenID を使用して会社の SSO サーバーに接続できる場合があります。
§OpenID フローの概要
- ユーザーは OpenID(URL)を提供します。
- サーバーは URL の背後にあるコンテンツを検査し、ユーザーをリダイレクトする必要がある URL を生成します。
- ユーザーは OpenID プロバイダーで認証を確認し、サーバーにリダイレクトされます。
- サーバーはそのリダイレクトから情報を受信し、プロバイダーに情報が正しいことを確認します。
すべてのユーザーが同じ 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 つの重要な関数があります
OpenIdClient.redirectURL
は、ユーザーをリダイレクトする必要がある URL を計算します。ユーザーの OpenID ページを非同期的に取得する必要があるため、Future[String]
を返します。OpenID が無効な場合、返されたFuture
は失敗します。OpenIdClient.verifiedId
はRequestHeader
を必要とし、それを検査して、検証済みの OpenID を含むユーザー情報を確立します。情報の信頼性を確認するために OpenID サーバーに非同期的に呼び出しを行い、UserInfo の future を返します。情報が正しくない場合、またはサーバーチェックが false の場合(たとえば、リダイレクト URL が偽造されている場合)、返されたFuture
は失敗します。
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
で使用できるようになります。
このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインをお読みになった後、プルリクエストを送信してください。質問やアドバイスがありましたら、コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。