2012年8月19日日曜日

Instagram API Access Token 取得にエラーがでたら

InstagramのAPIを使ってアプリをつくるために、Access Tokenを取得しました。
途中ちょっと手間取ったので、備忘録としてエントリしておきます。

さて、単に写真だけをひっぱってくるくらいであればAccess Tokenは必要ないみたいですが、どうせならフォローしている人の写真をソートしたり、いいねしたりもできるようにしたいので、後でバタバタするより先に取ってしまうことにしました。

※以下は、Developer登録とClient登録が済んでいて各ID取得済みである前提で記載しています。まだの方はこちらのエントリの真ん中辺りを参考にしてください。

Access Token取得方法はAPIのドキュメントに詳しく書いてありますが、手っ取り早く日本語訳のほうを参考にさせていただきましょう。

ステップ1.ユーザに認証用URLを表示する

https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code
この時点で、ログインページを表示し、アプリケーションにデータへのアクセス許可を求める確認ページが表示されます。

ステップ2.Instagramサーバからリダイレクトされる

ユーザがログインに成功し、アプリケーションにアクセス許可を与えると、Instagramサーバがredirect_uriにcodeパラメータを付加して呼び出します。codeパラメータで渡された値は、ステップ3で用います。
http://your-redirect-uri?code=CODE

ステップ3.access_tokenを要求する

ステップ2でcodeパラメータを受け取ることができました。この値を使い、指定したユーザ用のaccess_tokenを受け取るためのデータ交換をおこないます。データ交換は、access_token用URLにcodeの値と併せて、いくつかのアプリケーション認証情報をPOSTで送信するだけのことです。必要なパラメータを以下に示します。

  • client_id クライアントID
  • client_secret クライアントシークレット
  • grant_type 現在、"authorization_code"のみ指定することができます。
  • redirect_uri 認証リクエストを送信した際にredirect_uriで指定した値です。注意: この値は、認証リクエストで指定した値と完全に一致していなければなりません。
  • code 認証ステップで受け取ったcodeパラメータの値

access_token要求は、たとえば次のようになります。
curl \
    -F 'client_id=CLIENT-ID' \
    -F 'client_secret=CLIENT-SECRET' \
    -F 'grant_type=authorization_code' \
    -F 'redirect_uri=YOUR-REDIRECT-URI' \
    -F 'code=CODE' \
    https://api.instagram.com/oauth/access_token
呼び出しが成功すると、OAuthトークンを整形したデータが返されます。

ということで、ユーティリティからターミナルを起動して、上記のコマンドを実行します。最後の一行を入れてreturnキーを押して、2秒程待つと・・・
あれ?エラーです・・・orz
念の為、Instagramから一度ログアウトして、再度ステップ1から再開しCODEを再取得して試してみましたがまたエラーです_| ̄|○
返ってくるメッセージを見ると400エラーのようですが、後ろに"No matching code found"とかも書いてます。うーん、CODEはコピペだから間違う筈ないんだけどなあ。
悩んだときはドキュメントに立ち戻ってみます。
すると上記の下にこんな記述がぁっ!

“サーバ機能を持たないアプリケーション(たとえば、完全に独立したJavaScriptアプリケーションなど)を作成する場合は、上記のステップ3を実行することはできません。つまり、access_tokenを受け取ることも、クライアントシークレットを渡すこともできません。クライアントシークレットは、アプリケーションの管理下にないデバイスに保存することは絶対に避けなければなりません。では、access_tokenを受け取るにはどうしたらいいのでしょう?OAuth 2.0仕様を策定した賢い人たちは、この問題をちゃんと予期しており、暗黙の認証フローを用意したのです。”

あらら、なんか怒られたみたいです。
え、でもcurlってFTPサーバーみたいに動くコマンドなんじゃないの?なんで??
という疑問は素人が考えても仕方がないんで取りあえず横に置いておいて、その「暗黙の認証フロー」を試してみることにします。

クライアントサイド(暗黙の)フロー

ステップ1.ユーザに認証用URLを表示する

https://instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=token
この時点で、ログインページを表示し、アプリケーションにデータへのアクセス許可を求める確認ページが表示されます。明示的フローの場合と違い、response_typeパラメータの値が"token"であることに注意してください。

ステップ2.URLフラグメントによりaccess_tokenを受け取る

ユーザがログインに成功し、アプリケーションにアクセス許可を与えると、Instagramサーバがredirect_uriにURLフラグメントとしてaccess_tokenを付加して呼び出します。次のようになります。
http://your-redirect-uri#access_token=ACCESS-TOKEN
URLフラグメントのaccess_token部分を取り出せばおしまいです。

あっさり、上記の方法でAccess Tokenが取得できました・・・

同じ様にエラーでAccess Tokenの取得ができない方は、クライアントサイドフローを試してみて下さい。

0 件のコメント:

コメントを投稿