サイトのトップへ戻る

Twitter 開発者 ドキュメント日本語訳

アプリケーション単独認証



概要

Twitter では、アプリケーションは (指定したユーザーの情報を使うのではなく)自身の認証情報のみを使って認証済みリクエストを発行することができます. Twitterの実装は OAuth 2 仕様Client Credentials Grantフローに基づいています。 OAuth 1.0a ではユーザーの認証情報を使ったリクエスト発行も必要なので注意してください。

アプリケーション単独認証を使うと、認証ユーザーを識別するための情報をどこにも保持していないので、ツイートの投稿のようにユーザーを識別する情報が必要なエンドポイントへのAPIリクエストでは使用できません。しかし使用可能なエンドポイントでは、速度制限が緩くなっています。

例えば、アプリケーション単独認証では以下のようなことができます。:

  • ユーザーのタイムラインを取得する;
  • 指定したアカウントの友達やフォロワーにアクセスする;
  • ユーザーが作成したリストにアクセスする;
  • ツイートを検索する;
  • 指定したユーザーの情報を取得する;

そして以下のようなことはできません:

  • ツイートやその他リソースを投稿する;
  • ストリーミングエンドポイントに接続する;
  • ユーザーを検索する;
  • 指定したgeo エンドポイントを使用する;
  • ダイレクトメールやアカウントの資格情報にアクセスする;

各エンドポイントのページで、そのエンドポイントでアプリケーション単独認証が使用可能か確認することができます。



認証フロー

アプリケーション単独認証は以下のフローを実行します:

  • アプリケーションはそのコンシューマキーと秘密情報をエンコードし、特別な資格情報のまとまりを生成します。
  • アプリケーションはPOST oauth2 / tokenエンドポイントへリクエストを作成し、これら資格情報とベアラートークンを交換します。
  • REST APIにアクセスした時、アプリケーションはベアラートークンを使って認証します。

リクエストに署名する必要がないので、この手法は標準のOAuth 1.0aモデルよりも大幅に簡単になります。

Diagram illustrating the application-only auth flow


アプリケーション単独認証について

トークンはパスワードと同じくらい重要なものです

Keep in mind that the consumer key & secret, bearer token credentials, and the bearer token itself grant access to make requests on behalf of an application. これらの値はパスワードと同じくらいデリケートなものなので、信頼できない相手への共有や配布は絶対にしないでください。

SSL は絶対に必要です

この認証方法では、SSLでしかセキュリティを確保できません。従って、全てのリクエスト (トークンの取得と使用の両方)ではHTTPSエンドポイントを使用 しなければなりません。HTTPSエンドポイントを使用する場合は、API v1.1の使用も必須になります。Connecting to Twitter API using SSLに詳細が記載されたベストプラクティスに従ってください — peers should always be verified.

ユーザーの資格情報は必要ありません

アプリケーション単独認証を使用してリクエストを発行する場合、“カレントユーザー”という概念はありません。従って、POST statuses / updateのようなエンドポイントはアプリケーション単独認証では機能しません。ユーザーの資格情報を使ってリクエストを発行するための詳細情報については OAuthを使用する を参照してください。

速度制限

アプリケーションでは現在二つの種類の速度制限があります。

Requests made on behalf of users with access tokens depletes from a different rate limiting context than that used in application-only authentication. In other words, requests made on behalf of users will not deplete from the rate limits available through app-only auth and requests made through app-only auth will not deplete from the rate limits used in user-based auth.

GET application / rate_limit_status はアプリケーション単独認証をサポートしています。 By issuing requests to this method with your application bearer token, you’ll receive a response indicating the current window’s per-resource rate limiting context. Instead of receiving a “rate_limit_context” field indicating the access token being used, you will receive a “application” field instead, with the value being your application’s consumer key.

{
  "rate_limit_context": {
      "application": "nXtEH7H0mi0qT8kSyo7DQ"
  },
  "resources": {
    "search": { 
      "/search/tweets": {
        "limit": 450,
        "remaining": 420,
        "reset": 1362436375 }
    }
  }
}

アプリケーション単独認証をサポートしているメソッドを探すもう一つの方法は、rate limit indexドキュメントでアプリケーション単独認証の速度制限が記載されたメソッドを見つけることです。



アプリケーション単独リクエストを発行する



Step 1: コンシューマキーと秘密情報をエンコードする

この手順ではアプリケーションのコンシューマキーと秘密情報をエンコードして、ベアラートークンを取得するための資格情報を生成します:

  1. RFC 1738に従い、コンシューマキーとコンシューマ秘密情報をURLエンコードします。 この記事を書いている時点ではコンシューマーキーと秘密情報に変更点はありませんが、将来的にこれら値の形式が変更された場合でもこの手順は実行しなければなりません。
  2. エンコードしたコンシューマキーとコロン文字 “:”とエンコードしたコンシューマ秘密情報をつなげて一つの文字列にします。
  3. 上記手順でできた文字列をBase64 エンコード します。

以下はこのアルゴリズムでの処理結果を示す値です。このページで使用されているコンシューマ秘密情報は実際のリクエストでは使用できないので注意してください。

コンシューマキー xvz1evFS4wEEPTGEFPHBog
コンシューマ秘密情報 L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg
RFC 1738 エンコードした
コンシューマキー(変化なし)
xvz1evFS4wEEPTGEFPHBog
RFC 1738 エンコードした
コンシューマ秘密情報 (変化なし)
L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg
資格情報ベアラートークン xvz1evFS4wEEPTGEFPHBog:L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg
Base64 エンコードした資格情報ベアラートークン
eHZ6MWV2RlM0d0VFUFRHRUZQSEJvZzpMOHFxOVBaeVJnNmllS0dFS2hab2xHQzB2SldMdzhpRUo4OERSZHlPZw==


Step 2: ベアラートークンを取得する

step 1で算出した値は、POST oauth2 / tokenへリクエストを発行してベアラートークンと交換しなければなりません:

  • リクエストは HTTP POST リクエストでなければなりません。
  • リクエストではAuthorizationヘッダにBasic <step 1 でbase64 エンコードした値 > を設定しなければなりません。
  • リクエストでは Content-Typeヘッダにapplication/x-www-form-urlencoded;charset=UTF-8 の値を設定なければなりません。
  • リクエストのbody部分は grant_type=client_credentialsでなければなりません。

リクエスト例 (Authorization ヘッダは改行してあります):

POST /oauth2/token HTTP/1.1
Host: api.twitter.com
User-Agent: My Twitter App v1.0.23
Authorization: Basic eHZ6MWV2RlM0d0VFUFRHRUZQSEJvZzpMOHFxOVBaeVJn
                     NmllS0dFS2hab2xHQzB2SldMdzhpRUo4OERSZHlPZw==Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 29
Accept-Encoding: gzip

grant_type=client_credentials

リクエストの形式が正しい場合、サーバはJSON形式の応答を返します:

応答例:

HTTP/1.1 200 OK
Status: 200 OK
Content-Type: application/json; charset=utf-8
...
Content-Encoding: gzip
Content-Length: 140

{"token_type":"bearer","access_token":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%2FAAAAAAAAAAAAAAAAAAAA%3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}

アプリケーションでは取得したオブジェクト内のtoken_typeキーに設定されている値がbearerになっているかを確認してください。 access_tokenキーに設定されている値がベアラートークンです。

いったんベアラートークンが有効になると、それが無効になるまでの間は、/oauth2/tokenへ同じ資格情報でリクエストを発行すると同じベアラートークンが取得されるので注意してください。



Step 3: ベアラートークンを使って API リクエストを認証する

ベアラートークンを使って、アプリケーション単独認証をサポートしているAPIエンドポイントへリクエストを発行することができます。 ベアラートークンを使用するには、通常のHTTPリクエストを作成してAuthorizationヘッダに <step 2で取得したbase64 ベアラートークンの値>を設定します。 ログインする必要はありません。

リクエスト例(Authorization ヘッダは改行してあります):

GET /1.1/statuses/user_timeline.json?count=100&screen_name=twitterapi HTTP/1.1
Host: api.twitter.com
User-Agent: My Twitter App v1.0.23
Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%2FAAAAAAAAAAAA
                      AAAAAAAA%3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Accept-Encoding: gzip


ベアラートークンの無効化

ベアラートークンが漏洩したり、何らかの理由で無効にする必要がある場合は、 POST oauth2 / invalidate_tokenを実行します。

リクエスト例 (Authorization ヘッダは改行してあります):

POST /oauth2/invalidate_token HTTP/1.1
Authorization: Basic eHZ6MWV2RlM0d0VFUFRHRUZQSEJvZzpMOHFxOVBaeVJn
                     NmllS0dFS2hab2xHQzB2SldMdzhpRUo4OERSZHlPZw==
User-Agent: My Twitter App v1.0.23
Host: api.twitter.com
Accept: */*
Content-Length: 119
Content-Type: application/x-www-form-urlencoded

access_token=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%2FAAAAAAAAAAAAAAAAAAAA%3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

応答例:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 127
...

{"access_token":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%2FAAAAAAAAAAAAAAAAAAAA%3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}


一般的なエラーの場合

この項目では、ネゴシエーションとベアラートークンの使用に関する一般的な間違いについていくつか説明します。 ここでは発生しうるエラー応答を全て網羅しているわけではないので注意してください - 予期せぬエラーコードと応答にも気を配ってください!



無効なリクエストでベアラートークンの取得や無効化を行う

以下を試してください:

  • 無効なリクエスト(例えば、grant_type=client_credentialsを削る)でベアラートークンを取得する 。
  • アプリの不正な資格情報や失効した資格情報を使い、ベアラートークンの取得や無効化を行う。
  • 不正な、もしくは失効したベアラートークンを無効化する。
  • 短い時間でとても頻繁にベアラートークンを取得する。

すると以下のような応答結果が返るでしょう:

HTTP/1.1 403 Forbidden
Content-Length: 105
Content-Type: application/json; charset=utf-8
...

{"errors":[{"code":99,"label":"authenticity_token_error","message":"Unable to verify your credentials"}]}


無効なベアラートークンを付けてAPI リクエストを発行する

不正な、もしくは失効したベアラートークンを使ってAPIリクエストを作成すると、以下の応答結果が返ります:

HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
Content-Length: 61
...

{"errors":[{"message":"Invalid or expired token","code":89}]}


アプリケーション単独認証をサポートしていないエンドポイントでベアラートークンを使用する

ユーザー識別情報(statuses/home_timelineのような)が必要なエンドポイントに対してベアラートークンを付けたリクエストを発行すると、以下の応答が返ります:

HTTP/1.1 403 Forbidden
Content-Type: application/json; charset=utf-8
Content-Length: 91
...

{"errors":[{"message":"Your credentials do not allow access to this resource","code":220}]}