GoogleのOAuth 2.0対応を確認した

こんばんは、ritouです。
タイトルの通り、GoogleもOAuth 2.0対応しています。

Blogは"Monday, March 14, 2011"ってことで、日本はそれどころじゃなかった感がありますが、"Google OAuth 2.0"でググっても関連エントリが少なくてちょっとさみしかったので、ちょっと見てみましょう。

対応したフローは3つ!

  • The client-side flow : JavaScriptとかで動く、いわゆるUser-Agent Profile
  • The server-side flow : WebServerがDirect Commを行う、いわゆるWeb Server Profile
  • The native application flow : デスクトップ、モバイルアプリ向けですって。楽しみですね!

ということで、さっそく各フローの処理を見てみましょう。
って、このブログ見てくれる方はもうOAuth 2.0 Draft 10あたりの説明なんて飽きましたよね?
最初の2つはさくっといきましょう。

OAuth 2.0 for client-side web applications

いわゆる、End User Authz Endpointはこちらになります。

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

特に変わったパラメータは見当たりませんね。
このようなURLにユーザーを送ります。
Scopeは必須で、URIの形式になっています。

https://accounts.google.com/o/oauth2/auth?
client_id=21302922996.apps.googleusercontent.com&
redirect_uri=https://www.example.com/back&
scope=https://www.google.com/m8/feeds/&
response_type=token


画面が出て、Allow accessが完了すると、こんな感じで戻ってきます。

https://www.example.com/back#access_token=1/QbIbRMWW&expires_in=4301

エラーの場合はフラグメント識別子ではないのですね。

https://www.example.com/back?error=access_denied

window.location.hashを使ってハッシュ部分の値を取得し、Cookieに突っ込んだりサーバーにPOSTしたりすればいいとあります。
サーバーに送るならこのProfile使わなくてもいい気がしますが。
access tokenの有効期限が切れた後、もう一度上記のGoogleのURLにユーザーを送ると、同意済ユーザーの場合はすぐにリダイレクトで戻ってくるらしいです。

OAuth 2.0 for server-side web applications

こちらも準拠しているのでとくに変わったパラメータはありません。

https://accounts.google.com/o/oauth2/auth?
client_id=824390819211.apps.googleusercontent.com&
redirect_uri=https://www.example.com/back&
scope=https://www.google.com/m8/feeds/&
response_type=code

Allow access の後、Authorization Codeが戻ってきます。

https://www.example.com/back?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp6

あとはいつもの通りです。
Token Endpointは以下のようになります。

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

リクエストの例はこちら。

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp6&
client_id=21302922996.apps.googleusercontent.com&
client_secret=XTHhXh1SlUNgvyWGwDk1EjXB&
redirect_uri=https://www.example.com/back&
grant_type=authorization_code

レスポンスの例はこちら。

{
"access_token":"1/fFAGRNJru1FTz70BzhT3Zg",
"expires_in":3920,
"refresh_token":"1/6BMfW9j53gdGImsixUH6kU5RsR4zwI9lUVX-tqf8JXQ"
}

refresh tokenにも対応していますね。mixiなどと同じです。

OAuth 2.0 for native applications

基本的にはWeb Serverの場合と同じですが、redirect_uriの指定内容が以下のようになります。

redirect_uri=urn:ietf:wg:oauth:2.0:oob

urn(Uniform Resource Name)について気になる者は各自調べておくこと。
それ以外は特におかしなものもなく、ユーザーはこのようなURLに送られます。

https://accounts.google.com/o/oauth2/auth?
client_id=21302922996.apps.googleusercontent.com&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
scope=https://www.google.com/m8/feeds/&
response_type=code

そして、お決まりのAllow accessが終わると、Authorization Codeが画面に表示されます。
※デモがまだできていないのでキャプチャがありません。
この画面、Titleがこんな感じになっています。

Success code=4/ThisValueIsDummyMyNameIsRitou

頭の良い開発者の方はWindowのタイトルが変わるのを見張ってて、タイトルがこのパターンになったらAuthorization Codeを取得してWindowを閉じて処理を続けましょうと。
簡単ですね!って思った人は、やり方を私に教えてください。

それ以外はごくごく標準的なOAuth 2.0のフローなので、省略します。

まとめ

  • とくに余計なパラメータもなく、プロトコルに準拠している
  • GoogleさんのScopeはURL
  • リダイレクトURIにoobを指定して、Authorization Code表示画面が出るとこでNative Appは気合を入れろ!

OAuth 2.0対応サービスで最も使われているdisplayパラメータは使われていませんね。
facebookの流れに乗らない感じが素晴らしいと思います。

ぜひ、使ってみましょう!
Native Appの登録がよくわからないので、デモはまた今度orz...