Instagram APIはOAuth 2.0とxAuthに対応しているという謎

なぜ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 :

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たたくのもアレなのでこの実装は便利ですね。

あとはAccess Tokenを用いてAPIアクセスするだけですね。

Client-Side (Implicit) Authentication

続いて、Client Secretを持たない場合。
これがあれば、Instagram @Anywhereみたいなのが作れますね。

AuthN Request :

response_typeが"token"に代わっただけですね。

AuthN Response :

http://your-redirect-uri#access_token=ACCESS-TOKEN

戻り先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と同じです。
ほら、簡単ですよね。
ライブラリだってこれぐらいなら何とか頑張れないもんですかね?

スクリーンショットなど

すでに実装を行っているhttp://web.stagram.com/の画面だけ紹介しておきます。

ログイン画面

同意画面


まとめ

APIについては別の人たちが説明してくれるのでしょう。省略します。

OAuth 2.0についてはImplicitに対応しているのがおもしろいですね。
センシティブな情報を扱うところはSecretなしのリソースアクセスにはなかなか踏み切れない部分もあるところですが、JSのみで簡単にInstagramのデータを使える!って感じになるかもしれません。
RythonやRubyのライブラリが載せてありましたが、Implicitの方はtwitterfacebookのように、JSを提供するとみんな使ってくれるかもしれませんね。