§Play の OpenID 対応
OpenID はユーザが単一のアカウントで複数のサービスにアクセスできるようにするためのプロトコルです。 Web 開発者としては、 OpenID を使うことで、ユーザが別のサービスで既に作成してあるアカウント (例えば Google アカウント ) であなたの Web アプリケーションにログインできるようになります。エンタープライズ向けには、企業の SSO サーバに接続するために OpenID を使うといったことも考えられます。
§OpenID のフロー
- ユーザが OpenID (ある URL) を提供します。
- アプリケーションサーバが URL の示すコンテンツを検証し、ユーザのリダイレクト先 URL を生成します。
- ユーザが OpenID プロバイダのサイトにて認可情報を確認し、アプリケーションサーバに再度リダイレクトされます。
- アプリケーションサーバがリダイレクトから認可情報を取得して、その情報が正しいことをプロバイダに確認します。
すべてのユーザが同じ OpenID プロバイダを使う場合 (例えば Google アカウントにのみ依存すると決断した場合) 、ステップ 1 を省略することができます。
§Play Framework における OpenID
OpenID API には特に重要な関数が二つあります。
OpenID.redirectURL
はユーザのリダイレクト先 URL を計算する関数です。この関数は内部でユーザの OpenID ページを取得しにいくため、String
ではなくPromise<String>
を返します。OpenID が正しくない場合、例外が発生します。OpenID.verifiedId
は現在のリクエストの内容を見て、検証済みの OpenID などのユーザ情報を確立します。この関数はユーザ情報を認証するために内部で OpenID サーバへ通信を行うため、UserInfo
ではなくPromise<UserInfo>
を返します。ユーザ情報が正しくないか、またはサーバによるチェックが失敗(例えば、リダイレクトURLが捏造されていたなどの理由によって)した場合は返却されるPromise
はThrown
になります。
いずれの場合でも、常に例外をキャッチしておき、もし例外が投げられた場合はユーザをログインページへリダイレクトさせつつ、関連情報を表示するべきでしょう。
注意: (2012-07-02) 現在、Java の UserInfo は常に null の ID を返します。チケットは ここ です。
§拡張属性
OpenID はユーザの同一性を確かめるために利用することができます。それ以外にメールアドレスや名前、苗字などの取得のために 拡張属性 というものもサポートされています。
OpenID サーバに対しては、*任意* および 必須 の属性のどちらか一方または両方をリクエストすることができます。必須の属性を要求するということは、ユーザがその情報を提供しないかぎり、あなたのサービスへログインできないことを意味します。
拡張属性はリダイレクト URL の中でリクエストされます。
Map<String, String> attributes = new HashMap<String, String>();
attributes.put("email", "http://schema.openid.net/contact/email");
OpenID.redirectURL(
openid,
routes.Application.openIDCallback.absoluteURL(),
attributes
);
リクエストした属性は OpenID サーバから返却された UserInfo
より取得することができます。