Twitter では、アプリケーションは (指定したユーザーの情報を使うのではなく)自身の認証情報のみを使って認証済みリクエストを発行することができます. Twitterの実装は OAuth 2 仕様のClient Credentials Grantフローに基づいています。 OAuth 1.0a ではユーザーの認証情報を使ったリクエスト発行も必要なので注意してください。
アプリケーション単独認証を使うと、認証ユーザーを識別するための情報をどこにも保持していないので、ツイートの投稿のようにユーザーを識別する情報が必要なエンドポイントへのAPIリクエストでは使用できません。しかし使用可能なエンドポイントでは、速度制限が緩くなっています。
例えば、アプリケーション単独認証では以下のようなことができます。:
そして以下のようなことはできません:
各エンドポイントのページで、そのエンドポイントでアプリケーション単独認証が使用可能か確認することができます。
アプリケーション単独認証は以下のフローを実行します:
リクエストに署名する必要がないので、この手法は標準のOAuth 1.0aモデルよりも大幅に簡単になります。
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でしかセキュリティを確保できません。従って、全てのリクエスト (トークンの取得と使用の両方)では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ドキュメントでアプリケーション単独認証の速度制限が記載されたメソッドを見つけることです。
この手順ではアプリケーションのコンシューマキーと秘密情報をエンコードして、ベアラートークンを取得するための資格情報を生成します:
以下はこのアルゴリズムでの処理結果を示す値です。このページで使用されているコンシューマ秘密情報は実際のリクエストでは使用できないので注意してください。
コンシューマキー | xvz1evFS4wEEPTGEFPHBog |
コンシューマ秘密情報 | L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg |
RFC 1738 エンコードした コンシューマキー(変化なし) |
xvz1evFS4wEEPTGEFPHBog |
RFC 1738 エンコードした コンシューマ秘密情報 (変化なし) |
L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg |
資格情報ベアラートークン | xvz1evFS4wEEPTGEFPHBog:L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg |
Base64 エンコードした資格情報ベアラートークン |
eHZ6MWV2RlM0d0VFUFRHRUZQSEJvZzpMOHFxOVBaeVJnNmllS0dFS2hab2xHQzB2SldMdzhpRUo4OERSZHlPZw== |
step 1で算出した値は、POST oauth2 / tokenへリクエストを発行してベアラートークンと交換しなければなりません:
Authorization
ヘッダにBasic <step 1 でbase64 エンコードした値 > を設定しなければなりません。
Content-Type
ヘッダにapplication/x-www-form-urlencoded;charset=UTF-8 の値を設定なければなりません。
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
へ同じ資格情報でリクエストを発行すると同じベアラートークンが取得されるので注意してください。
ベアラートークンを使って、アプリケーション単独認証をサポートしている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リクエストを作成すると、以下の応答結果が返ります:
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}]}