なぜInstagram APIはOAuth 2.0 + xAuthなの?OAuth 2.0 draft 10ならResource Owner Password Credentialsなんじゃないの?続きはBlogに書きます
http://twitter.com/ritou/status/40750451557277696
ということで、今日はInstagram APIのOAuth実装を確認してみます。
ドキュメントはこちらです。
開発者としての登録とログインが必要かもしれません。
OAuth 2.0 Draft 10の2つのProfileをサポート
ドキュメントは以下のように書いてあります。
- Server-side (Explicit) Flow : web server profileに相当
- Client-Side (Implicit) Authentication : user-agent profileに相当
なんで片方はFlowでもう一方はAuthN・・・なんてことは言いません。
mixiと同様に、Draft 10の仕様にのっとってあります。
Server-side (Explicit) Flow
このBlog見てくれる人はもう見飽きたと思いますが、ざっくり流れを確認します。
AuthN Request :
- Endpoint : https://api.instagram.com/oauth/authorize/
- client_id
- redirect_uri : 戻り先URL
- response_type : "code"
- scope : basic/comments/relationships/likes
- display : iPhoneなどのいわゆるモバイルのときは"touch"を指定
ScopeとDisplayのパラメータぐらいなら、私たちに何も恐れるものはありません。
stateパラメータは使えるのでしょうかね?
AuthN Response :
- Endpoint : 戻り先URL
- code : AuthZ Code
AuthZ Codeが返されます。
エラーの場合は省略します。
Access Token Request :
- client_id
- client_secret
- grant_type: ここでは"authorization_code"を指定
- redirect_uri
- code : 上でもらったAuthZ Code
ここまでも問題ありませんね。
Access Token Response :
{ "access_token": "fb2e77d.47a0479900504cb3ab4a1f626d174d2d", "user": { "id": "1574083", "username": "snoopdogg", "first_name": "Snoop", "last_name": "Dogg", "profile_picture": "http://distillery.s3.amazonaws.com/profiles/profile_1574083_75sq_1295469061.jpg" } }
おや、Refresh Tokenがないですね。
Access Tokenを取得するタイミングで、ユーザー情報を返しています。
OpenID Connectみたいですが、わざわざユーザー情報取得するためにAPIたたくのもアレなのでこの実装は便利ですね。
Client-Side (Implicit) Authentication
続いて、Client Secretを持たない場合。
これがあれば、Instagram @Anywhereみたいなのが作れますね。
AuthN Request :
- Endpoint : https://api.instagram.com/oauth/authorize/
- client_id
- redirect_uri : 戻り先URL
- response_type : "token"
- scope : basic/comments/relationships/likes
- display : iPhoneなどのいわゆるモバイルのときは"touch"を指定
response_typeが"token"に代わっただけですね。
AuthN Response :
戻り先URLに、フラグメントとしてAccess Tokenがついて返されます。
Client側は、JSなどでAccess Tokenの値を取得する必要があります。
これでAccess Token取得完了ですね。
あ、こっちの場合は以下のAPIからユーザー情報を別で取得しないといけませんね。
なぜかxAuthに対応
twitterと同じように、xAuth使いたいなら、連絡して承認もらってください。
あああ、この人たちも"XAuth"ってつづりを使ってる。。。
じゃなくて、ひっかかるのはなぜxAuthなのかということです。
xAuthはOAuth 1.0(a)ベースです。
OAuth 2.0 Draft 10でいうと、"Resource Owner Password Credentials"として、ユーザーのID/PWを使ってAccess Tokenを取得する方法が定義されています。
メリデメはどうなのでしょうか。
- 実装の難易度 : xAuthには署名の呪いがかけられている。Resource...の方が簡単
- ライブラリ ; Resource...に対応しているライブラリはない?(かも?って@novが言ってました)
まぁ、使いたい人は頑張って英語のメール出しましょう。
参考:"Resource Owner Password Credentials"
念のため、Resource...のフローを書いておきます。
Access Token Request :
- client_id
- client_secret
- grant_type: ここでは"password"を指定
- username
- password
- scope
Access Token ResponseはServer-side (Explicit) Flowと同じです。
ほら、簡単ですよね。
ライブラリだってこれぐらいなら何とか頑張れないもんですかね?