Rails

(Railsで)Google OpenIDを使ってみる

2008/11/12

先日、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の場合は、

  1. https://mixi.jpがOP Identifierなので、RPはここにXRDS文書を問い合わせる
  2. mixiはXRDS文書のありかを返す
  3. 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は、リダイレクト時に下記のようなことをやっています。

  1. OpenIdAuthentication#authenticate_with_open_idメソッドはbegin_open_id_authenticationメソッドを呼ぶ
  2. 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)

で取得することができます。


related posts


tags

, ,


have your say

Add your comment below, or trackback from your own site. Subscribe to these comments.

Be nice. Keep it clean. Stay on topic. No spam.

You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

:

:


« RailsとREST - 『アーキテクチャの生態系』