Facebook/GoogleのIDで米Yahoo!にログインできる機能を調べてみた

みなさん、こんばんは!
2011年、さっそくYahoo!Incに動きがあったので細かく見て行こうと思ったのですが、gdgdになりました。(長文注意)

記事はこちら。

では、どんな実装になっているか見ていきましょう。

の前に、振り返り!

今回の対応が行われる前、一足先にFlickrへのログインにGoogleOpenIDが使えるようになっていました。
みなさん、覚えていますか?

GoogleのOpenID RPになったのはFlickrというよりYahoo!Incですよ
まとめるとこんな感じでした。

  • FlickrはY!Incのログインの仕組みを利用
  • Flickr用ログイン画面からGoogleのアイコンを選択してOpenIDのフローへ入る
  • OpenIDの処理が終えると、Y!IncからFlickrに戻される

つまり、「Y!IncはGoogleOpenIDのRP実装は既に完了していた」とも言えます。

今回の対応とは?

おそらくこんな感じでしょう。

  • 全てのY!サービスのログイン画面にGoogleFacebookのアイコンを追加
  • Facebook ConnectでAuthNを行う処理を実装
  • ログイン後、既存のIDとの紐づけもしくは新規IDの簡易登録機能を実装

動作確認

ログイン画面を見てみましょう。

左の人のドヤ顔が若干気になりますが、アイコンが出ているのがわかります。
早速、facebookのアイコンをクリックしてみましょう。

Facebook Connectのログインフローの確認

アイコンをクリックするとHTTP Headerはこうなります。

GET
https://open.login.yahoo.com/openid/yrp/signin
?idp=facebook
&ts=(タイムスタンプ)
&.intl=us
&.done=http%3A%2F%2Fmy.yahoo.com
&rpcrumb=(ほげほげな文字列)

"おそらく"、idpでfacebookを指定し、rpcrumbの値で指定元(ここではログイン画面)を確認できるようにしているのではないかと思われます。
rpcrumbをいじるとエラー画面になりました。
また、タイムスタンプも受け取っているので、時間がたつとExpireのエラーを見ることもできました。
興味がある人は自分で試して下さい。

正しいパラメータの場合、このように続きます。

HTTP/1.1 302 Found
Location: https://www.facebook.com/login.php
          ?api_key=90376669494
          &cancel_url=https%3A%2F%2Fopen.login.yahoo.com%2Fopenid%2Fyrp%2Freturn_to%3Fsid%3D(なんかの文字列)
          &display=popup
          &fbconnect=1
          &next=https%3A%2F%2Fopen.login.yahoo.com%2Fopenid%2Fyrp%2Freturn_to%3Fsid%3D(なんかの文字列)
          &return_session=1
          &session_version=3
          &req_perms=email%2Cfriends_birthday%2Cfriends_education_history%2Cfriends_events%2Cfriends_location%2Cfriends_status%2Cfriends_work_history%2Coffline_access%2Cpublish_stream%2Cread_stream%2Cuser_about_me%2Cuser_activities%2Cuser_birthday%2Cuser_education_history%2Cuser_events%2Cuser_groups%2Cuser_interests%2Cuser_likes%2Cuser_location%2Cuser_religion_politics%2Cuser_status%2Cuser_work_history%2Cxmpp_login
          &v=1.0
          &locale=en_US

これは、OAuth 2.0風のリクエストではありませんが、両者でいろいろお話してこうしたんでしょう。
スクリーンショットはこんな感じですね。


ログイン画面です。続けましょう。メアドとPWをPOSTするとこう続きます。

HTTP/1.1 302 Found
Location: http://www.facebook.com/connect/uiserver.php
          ?app_id=90376669494
          &next=https%3A%2F%2Fopen.login.yahoo.com%2Fopenid%2Fyrp%2Freturn_to%3Fsid%3D(なんかの文字列)
          &display=popup
          &cancel_url=https%3A%2F%2Fopen.login.yahoo.com%2Fopenid%2Fyrp%2Freturn_to%3Fsid%3D(なんかの文字列)
          &locale=ja_JP
          &perms=email%2Cfriends_birthday%2Cfriends_education_history%2Cfriends_events%2Cfriends_location%2Cfriends_status%2Cfriends_work_history%2Coffline_access%2Cpublish_stream%2Cread_stream%2Cuser_about_me%2Cuser_activities%2Cuser_birthday%2Cuser_education_history%2Cuser_events%2Cuser_groups%2Cuser_interests%2Cuser_likes%2Cuser_location%2Cuser_religion_politics%2Cuser_status%2Cuser_work_history%2Cxmpp_login
          &return_session=1
          &session_version=3
          &fbconnect=1
          &canvas=0
          &legacy_return=1
          &method=permissions.request

これで、いわゆるConcent Pageが表示されます。

さっき言い忘れましたが、req_perms/permsパラメータで示されているいわゆるScope的なものがしこたまついています。
よって、これだけの情報がYahoo!に渡されますよっていう画面が表示されているというわけです。

さて、許可してY!Incに戻りましょう。

https://open.login.yahoo.com/openid/yrp/return_to
?sid=(セッションを示す文字列っぽいね)
&perms=email%2Cfriends_birthday%2Cfriends_education_history%2Cfriends_events%2Cfriends_location%2Cfriends_status%2Cfriends_work_history%2Coffline_access%2Cpublish_stream%2Cread_stream%2Cuser_about_me%2Cuser_activities%2Cuser_birthday%2Cuser_education_history%2Cuser_events%2Cuser_groups%2Cuser_interests%2Cuser_likes%2Cuser_location%2Cuser_religion_politics%2Cuser_status%2Cuser_work_history%2Cxmpp_login
&selected_profiles=(私を識別しちゃうっぽいね)
&installed=1
&session=(session_key,uid,expires,secret,sigとかが入っている文字列)

まぁ、OAuth 2.0ではないので細かい説明はしませんが、とりあえずこれでY!IncのOpenIDサーバーに戻ってきます。
それにしても、return_toエンドポイントでGooglefacebookも両方のリクエストをさばくんだろうか・・・バグりそうでちょっと嫌ですね。

既存のY!IDとの関連付け or 新規登録

ここで、ある分岐があります。
私は最初、Y!Incに登録していないEmailをfacebookに登録していました。
すると、新規ID登録のような画面になりました。

そして、Y!Incに登録しているEmailをfacebookに登録していた場合は、こんな感じになりました。

よって、既にY!Incに登録されているユーザーか新規ユーザーかを判断する材料にEmailを利用していると思われます。

ちなみに、GoogleのHTTP Headerはこの記事とほとんど同じ処理でした。
GoogleのOpenID RPになったのはFlickrというよりYahoo!Incですよ

最後に、PW再確認が必要なページの扱いを見てみましょう。
account infoページ、つまり登録情報関連のページを見るとき、PWの再確認が必要でした。
FB/Gでログインしたユーザーの場合どうなるかというと、"アイコンが表示されて、そこからメアド/PW空のログイン画面に遷移"します。


これで、今まで通りの本人確認のポリシーを保とうという考えなのかもしれません。
が、しかし、

普通のPW再確認できなくね?

今まで通り、Y!IncのID/PWでログインした場合、こんな画面になり、ループします。

まぁ、必要なあるパラメータが足りないのですが、これはバグかなぁ・・・
進みたい人は、下のリンクからログアウトしてID/PWを入れなおすといけます。

その他、紐づけ後のおかしな現象

facebookと紐づけたアカウントで、メールアドレスを変えて別のY!IDアカウントとして登録したら変なエラー発生

メアド+facebookのユーザーIDで判断しているのかなぁ・・・

ログインできたりできなかったり

紐づけ済みでY!Incのログイン画面からすすむとき、すんなりログインできるはずです。
実際、そうなるときもあるのですが、なぜか上の方で説明した既存IDとの紐づけるよ画面が出てくるときがありました。
これもバグかなぁ・・・

OpenIDとかのフローはどうなった?

もちろん、OpenIDのフローでもFB/Gのアカウントでログインできます。
plaxoの場合、ポップアップでY!Incの画面が出て、その上にさらにFB/Gのポップアップが来るのでちょっとアレですね。

まとめ
  • Facebook連携のパラメータはOAuthじゃなかった

少しまじめな話

今回の対応で、Y!IncはOpenIDでいうところのOP/RP両方に対応したことになります。
よって、Yahoo!Incを良く使う人は今まで通り、さらにGoogleFacebookを使ってる人ならより便利にYahoo!IncとYahoo!IDを使えるサービスが利用できるということになります。

もちろん、FB/Gのアカウントを利用する場合、Y!からしてみれば本人確認の手段を外部のサイトに依存することになります。これは大きな決断です。まぁ、米政府から認められるような認証機関になりたがっているGoogle、いろいろと話題になってプライバシーやセキュリティにスキを見せられない状況になってきたFacebookなら、なんとか大丈夫なのかなと思いますが、他のOpenIDも全て受け入れるというわけにはいかないかもしれませんね。Twitterはどうでしょうか。

そして、Yahoo! JAPANはこの動きをどうとらえるのでしょうか。
私の記憶だと、Yahoo! JAPANは日本一のIdPになろうとしていろいろな施策を行っています。
今後も2要素認証やリスクベースなんとかとかを考えていくのかもしれませんが、今回の外部のPW管理への依存が絡むと、本人確認のレベルの定義が微妙に変わりそうです。ただ、すごいめんどくさーな話になるとは思っていません。
国○IDとかいう大きな話にするつもりはありませんが、外部サイトとの間でPW入力のポリシー、多要素認証等のレベルを共有/整理できれば、どこのID/PWを使っても一定のレベルの本人確認が可能だと思います。IdPはユーザーが一番自然に、安全にたくさんのサービスを利用できることを最優先し、その上に決済とか?の付加価値で差異をつけていくことでたくさんのユーザーに利用されることを目標にしていくのがいいのではないでしょうか。

中の人たちには是非頑張っていただきたい!

おまけ

I want to recognize the hard work that has gone into this project, including the first step of convincing everyone to move in the direction of openness.
Special thanks goes out to Allen Tom.
Congratulations to the whole membership team (Developers, PM, PGM, UED and QA), who've spent a lot of time and energy to insure a great experience for all our users.
This would not have been possible without the efforts of the entire team.

http://developer.yahoo.com/blogs/ydn/posts/2011/01/third-party-auth/

Y!IncのMembershipチーム、よく頑張った!
今回の対応、もうやめてしまったけどOpenID/OAuthの仕様にもかかわり社内外の調整に注力したAllen Tomの功績は大きいですね。

私の場合、「あいつろくに引き継ぎしねーで逝きやがった」なんて言われているかも(^^;)
ではまた!