Y!モバゲーのOAuth、ログアウトに関する噂を検証してみた #idcon

残念ながら出席できなかったidconですが、そこで出たY!モバゲーの噂をちょっとまとめてみましょう。

  • 噂1.ログインするあたりでY!とOAuthでつないでいる
  • 噂2.ログアウトのときはリダイレクトでつないでY!と相互にログアウト連携している

これらを確かめるために、HTTP Headerを見て動作を推測してみましょう。

噂1.ログインするあたりでY!とOAuthでつないでいる

まずは、このURLを開きましょう。
http://yahoo-mbga.jp/

Yahoo!JAPAN IDだけで遊べる!
→今すぐ遊ぶ!

って感じで押すと、ヤフーのログイン画面が表示されます。

ここで、HTTP Headerは以下のようになっていました。

【リクエスト】今すぐ使う!
http://yahoo-mbga.jp/login/yahoo
GET /login/yahoo HTTP/1.1

...

【レスポンス】Y!のOAuthエンドポイント?
HTTP/1.1 302 Found
Location: https://auth.login.yahoo.co.jp/oauth/v2/request_auth?oauth_token=(省略)

...

【リクエスト】どうする?
https://auth.login.yahoo.co.jp/oauth/v2/request_auth?oauth_token=(省略)
GET /oauth/v2/request_auth?oauth_token=kqutcmc HTTP/1.1

...

【レスポンス】未ログイン状態だったのでログインサーバー?へリダイレクトして・・・
HTTP/1.1 302 Found
Location: https://login.yahoo.co.jp/config/login?(以下省略)

...

【リクエスト】そうすると・・・
https://login.yahoo.co.jp/config/login?(以下省略)
GET /config/login?(以下省略) HTTP/1.1

...

【レスポンス】ログイン画面が表示される!
HTTP/1.1 200 OK

一度、"https://auth.login.yahoo.co.jp/oauth/v2/request_auth"にリダイレクトしています。
これは、Yahoo! JAPANのOAuthエンドポイントです。

OAuth 2.0の仕様ばっかり読んでいる人は少し昔を思い出して下さい。
Yahoo! JAPANのOAuthはOAuth 1.0aですので、oauth_tokenの値がRequest Tokenですね。

では、ログインをした後にどういう遷移をするのでしょうか。

【リクエスト】ID/PWを入れてログイン
https://login.yahoo.co.jp/config/login?
POST /config/login? HTTP/1.1

...

【レスポンス】OAuthサーバーにリダイレクト?
HTTP/1.1 302 Found
Location: https://auth.login.yahoo.co.jp/oauth/v2/allow?oauth_token=(省略)&.src=ymbga&.scrumb=(省略)

...

【リクエスト】それから・・・
https://auth.login.yahoo.co.jp/oauth/v2/allow?oauth_token=(省略)&.src=ymbga&.scrumb=(省略)
GET /oauth/v2/allow?oauth_token=(省略)&.src=ymbga&.scrumb=(省略) HTTP/1.1

...

【レスポンス】この辺でいろいろ処理して・・・
HTTP/1.1 302 Found
Location: https://auth.login.yahoo.co.jp/oauth/v2/allow?oauth_token=(省略)&.src=ymbga&.scrumb=(省略)&crumb=(省略)

...

【リクエスト】んー、いろいろあるんでしょうね・・・
https://auth.login.yahoo.co.jp/oauth/v2/allow?oauth_token=(省略)&.src=ymbga&.scrumb=(省略)&crumb=(省略)
GET /oauth/v2/allow?oauth_token=(省略)&.src=ymbga&.scrumb=(省略)&crumb=(省略) HTTP/1.1

...

【レスポンス】終わった!Y!モバゲーにリダイレクトして完了!
HTTP/1.1 302 Found
Location: http://yahoo-mbga.jp/login/yahoo/callbak?oauth_token=(省略)&oauth_verifier=(省略)

ログインしたあとにauth.login.yahoo.co.jpを経由してyahoo-mbga.jpに戻っています。
きっと、auth.login.yahoo.co.jpでOAuthの処理をしているのでしょうね。
Request Token取得時にモバゲー側からY!に指定されたcallbackがhttp://yahoo-mbga.jp/login/yahoo/callbakとなっているようです。

以下のように登録画面が出ちゃった人は是非使ってみましょう!


噂2.ログアウトのときはリダイレクトでつないでY!と相互にログアウト連携している

よし、次はログアウトですよ。
今回は2パターンのログアウトを見ましょう。

  • Y!モバゲーでログアウトしたとき
  • Y!でログアウトしたとき(Y!メールとかY!オークションとか)
Y!モバゲーでログアウトしたとき

【リクエスト】いきなりY!のログアウトURLっぽいのにリダイレクトしています
http://login.yahoo.co.jp/config/login?logout=1&.direct=1&.done=http%3A%2F%2Fyahoo-mbga.jp%2Flogout&.sckey=ymbga3
GET /config/login?logout=1&.direct=1&.done=http%3A%2F%2Fyahoo-mbga.jp%2Flogout&.sckey=ymbga3 HTTP/1.1

...

【レスポンス】おっと、Y!モバゲーのログアウトURL?に戻されました
HTTP/1.1 302 Found
Location: http://yahoo-mbga.jp/logout

...

【リクエスト】ここでY!モバゲーがログアウト?
http://yahoo-mbga.jp/logout
GET /logout HTTP/1.1

...

【レスポンス】終わって再び最初の画面が・・・
HTTP/1.1 302 Found
Location: /login

...

【リクエスト】表示された!
http://yahoo-mbga.jp/login
GET /login HTTP/1.1

http://www.yahoo.co.jp/にいくと、未ログイン状態になっていることがわかります。

HTTP Headerを見るとCookieがいじられているポイントがいくつかあります。
Y!モバゲーから始まる場合は、【Y!モバゲーログイン状態】→【Y!ログアウト】→【Y!モバゲーログアウト】→【Y!モバゲー最初の画面】という遷移をしていることがわかります。
Y!ばっかりでわかりづらいorz

最初にY!モバゲーのログアウトじゃないの?って思われた方もいると思いますが、ここではまぁどっちでもいいような気がします。

Y!でログアウトしたとき(Y!メールとかY!オークションとか)

【リクエスト】loginって書いてあるY!のログアウトURLに遷移?
http://login.yahoo.co.jp/config/login?(省略)
GET /config/login?(省略) HTTP/1.1

...

【レスポンス】お!yahoo-mbga.jpにリダイレクトしています
HTTP/1.1 302 Found
Location: http://yahoo-mbga.jp/ylogout?.done=http%3a//login.yahoo.co.jp/config/login%3flogout=1%26.src=auc%26.done=http%253a//auctions.yahoo.co.jp/jp%26.direct=%26.intl=jp%26.partner=%26.pd=%26.last=%26.protoctl=

...

【リクエスト】Y!モバゲーのログアウトURLに遷移して・・・
http://yahoo-mbga.jp/ylogout?.done=http%3a//login.yahoo.co.jp/config/login%3flogout=1%26.src=auc%26.done=http%253a//auctions.yahoo.co.jp/jp%26.direct=%26.intl=jp%26.partner=%26.pd=%26.last=%26.protoctl=
GET /ylogout?.done=http%3a//login.yahoo.co.jp/config/login%3flogout=1%26.src=auc%26.done=http%253a//auctions.yahoo.co.jp/jp%26.direct=%26.intl=jp%26.partner=%26.pd=%26.last=%26.protoctl= HTTP/1.1

...

【レスポンス】再びY!のログアウトURLに遷移しています
HTTP/1.1 302 Found
Location: http://login.yahoo.co.jp/config/login?(省略)
http://login.yahoo.co.jp/config/login?(省略)
Set-Cookieあり
...

【リクエスト】ここで・・・
GET /config/login?(省略) HTTP/1.1

...

【レスポンス】Y!ログアウト完了!
HTTP/1.1 200 OK

http://www.yahoo.co.jp/にいくと、未ログイン状態になっています。
http://yahoo-mbga.jp/にいっても、未ログイン状態になっています。

Y!からログアウトするときには、【Y!ログイン状態】→【Y!ログアウトURLがY!モバゲーにリダイレクト】→【Y!モバゲーログアウト】→【Y!ログアウト】という画面遷移になっています。
今回のケースでは、Y!側は最後にログアウトしています。

確認したいときは、この動作確認をする直前(Y!モバゲーログイン状態のとき)にhostsファイルを更新して127.0.0.1 yahoo-mbga.jpとかに指定してみてください。
途中でローカルホストにアクセスするので処理が途中で止まるわけですが、ここでY!のログイン状態を確認すると、ログイン状態のままです。

なぜ最後にしているかを考えましょう。
OAuthのSP側であるY!はY!モバゲー以外のConsumerともログアウト連携をする可能性がありますよね。
つまり、「誰がどの環境でどのConsumerにログインしたか」を覚えているわけです。
最初にY!でログアウトしちゃうと、ログイン状態から「誰が」ログアウトしようとしているかがわからなくなってしまうので、ちょっと工夫する必要があります。
Y!モバゲーにいって戻ってきた後に、他のConsumerと連携していればそっちにもリダイレクトでつながなければなりませんので、ログイン状態のまま全てのConsumerを訪問した後にSP側でログアウトしているわけですね。

ただこの方法、連携しているConsumerに確実にリダイレクトできることが要件になります。
下記のような状態になったら残念な結果を迎えてしまいます。

  • サービスダウンしていてリダイレクトが停止
  • アクセス拒否されてリダイレクトが停止(IPアドレス単位でACLかかっていたなど)

そんなことを考えたうえで、ビーコン方式のログアウト連携の提案などをしてみたわけです。
まぁ。ビーコンの場合は3rd Party Cookieの話とかいろいろ出てきて微妙なわけですが。

宿題など

繰り返しになりますが、これはあくまで"HTTP Headerによる画面遷移を見ての推測"にすぎません。
このネタで残っている宿題としてはこのへんですかね。

  • 一見、同一サービスのようにユーザーに同意画面を見せないでOAuthでつなぐことの是非
  • OAuthのTokenのRefresh TokenとAccess Tokenの有効期限の関係や存在意義

これらはまた別途まとめます。

今回のidconもかなり濃い話がたくさんあったみたいなので、他の発表者の資料も見ていろいろ考えたいところです。
そして、次のidconには参加したい!と思っています。

ではまた。