先日、Google OpenIDがリリースされたので、Rails の open_id_authentication で認証とメールアドレス(gmail)の取得を試してみました。
Google OpenIDの概要
いつも通りid:ZIGOROuさんのところがくわしいですが、抜粋すると下記のようになっているみたいです。
- OP Identifier
https://www.google.com/accounts/o8/id← OP Identifierはない模様
- XRDS文書のありか
- https://www.google.com/accounts/o8/id
- OP Local Identifier
- https://www.google.com/accounts/o8/id?id=***************
たとえばMixiの場合は、
- https://mixi.jpがOP Identifierなので、RPはここにXRDS文書を問い合わせる
- mixiはXRDS文書のありかを返す
- RPはXRDS文書を解析してエンドポイントを得る
という流れですが、Googleの場合ではRPが直接2.のXRDS文書を指定するところからスタートします。
open_id_authenticationでGoogle OpenIDを使う
RailsのOpenID認証プラグイン open_id_authentication を使って、Google OpenIDで認証するときは、MixiやYahooの時と同じように、params[:openid_url]をhttps://www.google.com/accounts/o8/idとして指定してあげれば大丈夫です。
Google OpenIDからメールアドレスを取得する
Google OpenIDでは、いまのところAttribute Exchangeを使って、gmailアドレスを取得することができます。仕様はこちらです。
MixiではSREGで取得可能で、authenticate_with_open_idメソッドのオプションとして渡せば取得することができました。
今回はAX(Attribute Exchange)なので、open_id_authenticationをすこし変える必要がありそうです(たぶん)。
まずopen_id_authenticationは、リダイレクト時に下記のようなことをやっています。
- OpenIdAuthentication#authenticate_with_open_idメソッドはbegin_open_id_authenticationメソッドを呼ぶ
- begin_open_id_authenticationメソッドではリクエストを組み立てて(必要であればsregのパラメータも加えて)、ユーザをOP認証画面にリダイレクトさせる
2.のリクエストを組み立てるときに今回のaxのパラメータを追加すれば、gmailをくださいというリクエストも送ることが出来ます。具体的には下記のようなコードになります。
1 2 3 4 | ax = OpenID::AX::FetchRequest.new ax_email = OpenID::AX::AttrInfo.new('http://axschema.org/contact/email', 'email', true) ax.add(ax_email) open_id_request.add_extension(ax) |
ユーザがGoogleの認証画面でメールアドレスの送信を許可し、認証が完了すれば
OpenID::AX::FetchResponse.from_success_response(open_id_response)
で取得することができます。

