GoogleでOpenID Connectを体験!

おはようございます、ritouです。
GoogleOpenID ConnectのEndpointを実装したと聞きました。

Google's OpenIDConnect endpoint is now live in production, and we have a sample RP that shows the code required to use it at:
http://oauthssodemo.appspot.com/step/1
We have sent the config details for our endpoint to a few developers/vendors to let them start integrating with it, though we are not trying to formally announce it's availability at this time.

We will show it at the workshops Google is running Monday & Tuesday afternoon. The presenters at the Tuesday OIDF summit can use it as well if it helps.

http://lists.openid.net/pipermail/openid-specs-ab/Week-of-Mon-20110711/000607.html

調べてみます。

GoogleOpenID Connect対応とは

サンプルRPの説明はこちらです。
http://oauthssodemo.appspot.com/step/1
Googleが対応したのは、UserInfoエンドポイントの実装です。
試す方法は以下のようなOAuth 2.0の実装を行うだけです。

response_type=token、つまりOAuth 2.0におけるImplicit Flowの説明が書いてあります。

GoogleのことなのでAuthorization Code Flowも対応しているはず!
ということでAuthorization Code Flowの方のRPを実装してみます。

OpenID Connect on AuthZ Code Flow

前回のエントリに続いて、以下のシーケンス図が使えそうです。

サンプルRPはこちら。
http://www8322u.sakura.ne.jp/oidconnect/

2. AuthZ ServerにRequestを送信

エンドポイントはこちら。

https://accounts.google.com/o/oauth2/auth

必要なパラメータは以下の通りです。

  • response_type : code
  • client_id
  • redirect_uri : 戻り先
  • scope : 上記のScopeパラメータ
  • state

Googleにリダイレクトすると、このような画面が表示されます。

Allowを押すと、AuthZ CodeともにRPに戻されます。

6. Assertion要求/応答 = Access Token取得

エンドポイントはこちら。

https://accounts.google.com/o/oauth2/token

Access Tokenの取得もいつも通りです。

  • grant_type : "authorization_code"
  • code : 取得した値
  • redirect_uri
  • client_id
  • client_secret
8. UserInfo Endpointにアクセス

エンドポイントはこちら。

https://www.googleapis.com/oauth2/v1/userinfo

パラメータはAccess Tokenのみです。

  • access_token : 取得した値
9. 属性情報など応答

レスポンスは以下のようになります。

{
 "id": "114181308725730985237",
 "email": "xxxxxxxxx@gmail.com",
 "verified_email": true,
 "name": "Ryo Ito",
 "given_name": "Ryo",
 "family_name": "Ito",
 "link": "http://profiles.google.com/ritou06",
 "gender": "male",
 "locale": "ja"
}

項目の内容はGoogleのページを見てください。

TokenInfo Endpoint

OpenID Connectの仕様では、id_tokenの中身を確認するためのEndpointがこれにあたるように定義されています。

参考:
Draft: OpenID Connect Session Management 1.0 - draft 28

が、Googleが用意したこのEndpointは、Access Tokenの内容を返します。

https://accounts.google.com/o/oauth2/tokeninfo

パラメータはAccess TokenのみでGETのリクエストを送ります。
レスポンスには下記パラメータが含まれます。

  • issued_to : Tokenが発行されたClient ID
  • scope : Access TokenのScope
  • audience : TokenのTarget. 今回はissued_toと同じ
  • user_id : ユーザー識別子
  • expires_in : 有効期限

Access Tokenのみ保持している場合でも、useridやexpires_inなど確認できるので、使いどころはありそうです。

まとめ

  • UserInfo Endpointを実装した
  • Tokenの内容を確認できるToken Info(Check Session) Endpointも実装した
  • RP(Client)が行うのはScopeの拡張のみ
  • AuthZ Code Flow, Implicit Flowの両方に対応
  • ここで試せ http://www8322u.sakura.ne.jp/oidconnect/

今回のGoogleの対応のように、既存のOAuth 2.0のまずはこのように、UserInfoエンドポイントの実装から行うのがよさそうですね。
シンプルなProfile APIと言ってしまえばそれまでですが、各Server(OP)が統一されたレスポンスを返すだけでも今までよりは十分便利になると思います。

これからの拡張に期待しましょう。
ではまた。