stMind

about Tech, Computer vision and Machine learning

Instagram APIのドキュメントを読む Authentication編

Instagram Authentication

InstagamのAPIを読むの続き。Authencationについてまとめ。

OVERVIEW

  • OAuth 2.0
  • APIへのすべてのリクエストはSSL経由で行わないといけない
  • client_id, access_tokenが必要

DO YOU NEED TO AUTHENTICATE?

  • 「コメント」や「いいね!」やユーザのフィードをブラウズする場合は認証(access_token)が必要
  • ポピュラーを表示するだけのアプリだったら認証不要
    • client_idだけでOK
RECEIVING AN ACCESS_TOKEN

access_tokenを取得するために2つのことをする必要がある。

  • ユーザをInstagramの認証URLにリダイレクト
    • ユーザはアプリに自分のデータにアクセスさせるかどうか尋ねられる
  • ユーザを次の2つのうちどちらかの方法でリダイレクト(アプリ作者が選択)
    • server side flow(大半のアプリへ推奨)
      • 認証URLの中でcodeパラメータと一緒に指定したURIへリダイレクトする
      • instagramのaccess_token URLにcodeをPOSTして認証済みユーザのためのaccess_tokenと交換する
    • implicit flow
      • codeと一緒に指定したURIにリダイレクトする代わりに、リダイレクトURLにaccess_tokenを付加

Server-side(Explicit) Flow

  • Step1 : DIRECT YOUR USER TO OUR AUTHORIZATION URL
https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code
    • オプショナルなパラメータ
      • scope
        • basicスコープ以外を指定したい時(スコープについては一番下で)
      • display
        • モバイルに最適化された認証ページとサインインページをユーザに見せたい場合、"touch"を渡す
  • Step2 : RECEIVE THE REDIRECT FROM INSTAGRAM
    • ユーザに正しく認証されたら、Step3で使用するcodeパラメータと一緒に、指定されたredirect_urlにユーザをリダイレクト
http://your-redirect-uri?code=CODE
    • アプリ登録時のredirect URIにクエリパラメータを入力した場合、redirect URIの最初にそれを含んでいなければならない
    • ユーザに拒否されたら、エラーのパラメータと一緒にredirect_uriにリダイレクト
      • その場合は、エラーメッセージをユーザに提示するなど対処する
http://your-redirect-uri?error=access_denied&error_reason=user_denied&error_description=The+user+denied+your+request
  • Step3 : REQUEST THE ACCESS_TOKEN
    • アプリの識別パラメータとともに、前ステップで取得したcodeをaccess_tokenのエンドポイントにPOST
    • 必須のパラメータ
      • client_id
      • client_secret
      • grant_type
        • 現在はauthorization_codeのみサポート
      • redirect_uri
        • 認証時に使用したredirect_uri
        • 認証時と同じでなければならない
      • code
        • 取得したCODE
    • リクエスト例
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
    • レスポンス例
{
    "access_token": "fb2e77d.47a0479900504cb3ab4a1f626d174d2d",
    "user": {
        "id": "1574083",
        "username": "snoopdogg",
        "full_name": "Snoop Dogg",
        "profile_picture": "http://distillery.s3.amazonaws.com/profiles/profile_1574083_75sq_1295469061.jpg"
    }
}
    • expiry timeは含んでいないことに注意
    • access_tokenは明示的なexpiryはないが、ユーザがアクセスを無効にした場合、もしくはtokenがexpireされた場合を適切に取扱う必要がある
      • この場合、レスポンスのmeta情報に"error_type=OAuthAccessTokenError"が含まれる

Client-Side(Implicit) Authentication

例えばjavascript appなどの場合の認証。

  • Step1 : DIRECT YOUR USER TO OUR AUTHORIZATION URL
https://instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=token
    • ログイン画面とデータへのアクセス承認画面を表示
    • Explicit Flowと違い、response_typeに"token"を指定
  • Step2 : RECEIVE THE ACCESS_TOKEN VIA THE URL FRAGMENT
    • URL fragmentにaccess_tokenを含むredirect_uriにリダイレクト
http://your-redirect-uri#access_token=ACCESS-TOKEN
    • URL fragmentからaccess_tokenを取得すればよい
    • ユーザがアプリのアクセスを拒否したら、Explicit flowと同じエラーレスポンスが返る

Scope(Premissions)

  • OAuth 2.0の仕様ではアクセスのスコープを明示できる
  • 現在は、すべてのアプリはデフォルトでbasic read accessが可能
  • いいね!やコメントや友達を管理する場合には、認証のリクエストにおいてスコープを明示しなければならない
  • サポートしているスコープ
    • basic
      • ユーザの全データを読み込み可能
    • comments
      • コメントを作成または削除可能
    • relationships
      • ユーザをフォローまたはアンフォロー可能
    • likes
      • いいね!またはいいね!の取り消しが可能
  • 認証されていないスコープに対するリクエストをした場合には、OAuthPermissionsExceptionが返る
  • 複数のスコープを一度にリクエストするときは、単にスコープをスペースで区切る
    • URLの中では"+"にエスケープすることと同じ
    • likesとcommentsを明示する場合の例
scope=likes+comments