Twitter added "Sign in with Twitter" to their OAuth

Twitter added "Sign in with Twitter" to their OAuth

http://apiwiki.twitter.com/Sign-in-with-Twitter
何が起こったのか気になったので調べてみました。

■ the "oauth/authenticate" endpoint

Sign in with Twitter is the pattern of authentication that allows users to connect their Twitter account with third-party services in as little is one click.
It utilizes OAuth and although the flow is very similar, the authorization URL and workflow differs slightly as described below.

「in as little is one click」?
OAuthのフローと少し違うようです。

The normal flow dictates that applications send request tokens to oauth/authorize in Twitter's implementation of the OAuth Specification.
To take advantage of Sign in with Twitter, applications should send request tokens in the oauth_token paramater to oauth/authenticate instead.

OAuthの正常なフローではアプリケーションは「oauth/authorize」にrequest tokenを送る(リダイレクトさせる)けど、
Sign in with Twitterでは「oauth/authenticate」に送ります。

■ 動作比較

"oauth/authnticate"の処理はどうなるのか、実際に利用して"oauth/authorize"の挙動と比較してみます。
wikiにあるように、次の4つのユーザーの状態を試します。

  1. twitterにログインしていて、アプリケーションを承認している状態
  2. twitterにログインしていないが、アプリケーションを承認している状態
  3. twitterにログインしているが、アプリケーションを承認していない状態
  4. twitterにログインしておらず、アプリケーションを承認していない状態

自分がアプリケーションに対してLogin on Twitterから確認できます。
承認を取り消したいときは"Revoke Access"しておきます。

◆ oauth/authenticate

1 : 何も画面は出ずに、以前発行したAccess Token + user_id + screen_nameが返る
2 : (T)アカウントorEmail/PW入力画面 → 以前発行したAccess Token + user_id + screen_nameが返る
3 : (T)アカウントorEmail/PW入力画面 → (T)同意画面 → Request Token + user_id + screen_nameが返る(※)
4 : (T)アカウントorEmail/PW入力画面 → (T)同意画面 → Request Token + user_id + screen_nameが返る

(※) 3のときの挙動がwikiの説明と違います。

◆ oauth/authorize

1 : (T)同意画面 → Request Token + user_id + screen_nameが返る
2 : (T)アカウントorEmail/PW入力画面 → Request Token + user_id + screen_nameが返る
3 : (T)同意画面 → Request Token + user_id + screen_nameが返る(※)
4 : (T)アカウントorEmail/PW入力画面 → (T)同意画面 → Request Token + user_id + screen_nameが返る

こちらはけっこう普通ですね。

■ まとめ

1クリックとかいってたわりにoauth/authorizeよりもoauth/authenticateはトータルで画面多いような気がしますが。。。
oauth/authenticateは、一度でも同意をとっているUserに対しては毎回新しいAccessToken発行しなくて済むのでエコです。
が、以前のAccess Tokenが残っていない場合はoauth/authorizeを使ってもらいなおす必要があります。
なので、twitterのアカウントのみを使いたいConsumerは二つをうまく使い分けるといいかもしれません。

私が気付いていないことやこの機能のメリット知っている方がいたら教えてください。
今回はサンプルが中途半端な状態なので、もう少し手直ししたらデモ環境も公開します。

http://apiwiki.twitter.com/f/1239840279/oauth_sign_in_with_twitter_flow.png