リクエストの認証

このドキュメントでは、認証されたリクエストをTwitter APIに送信するためにHTTPリクエストを修正する方法を説明します。

TwitterのAPIはすべてHTTPプロトコルをベースにしています。つまり、TwitterのAPIを使用して作成されるすべてのソフトウェアは、構造化された一連のメッセージをTwitterのサーバーに送信します。たとえば、「Hello Ladies + Gentlemen, a signed OAuth request!!!」というテキストをツイートとして投稿するリクエストは、以下のようになります。

POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent:OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Content-Length:76
Host: api.x.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21

HTTPライブラリであれば、上のリクエストを最小限の手間で生成して発行できます。ただし、次のことが分からない場合、上記のリクエストは無効となってしまいます。

  1. どのアプリケーションがリクエストを行っているのか
  2. どのユーザーに代わってリクエストが投稿されているのか
  3. ユーザーに代わって投稿することをユーザーがアプリケーションに許可したかどうか
  4. 転送中に第三者によってリクエストが改ざんされたかどうか

 

アプリケーションがこの情報を提供できるようにするために、TwitterのAPIはOAuth 1.0aプロトコルを利用します。非常に簡単に言うと、Twitterの実装では、認証を必要とするリクエストに上記の質問に答えるための情報を含む追加のHTTP Authorizationヘッダーを含める必要があるということです。このヘッダーを含むように修正された上記のHTTPリクエストのバージョンは以下のようになります(通常、Authorizationヘッダーは1行にする必要がありますが、ここでは読みやすいように折り返されています)。

POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent:OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Authorization:
OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog",
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1318622958",
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
oauth_version="1.0"
Content-Length:76
Host: api.x.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21

このリクエストを作成すると、Twitter APIはこのリクエストを有効なリクエストとして受け入れます。

この署名プロセスが使用する統合の範囲外と思われる場合は、Webインテントの使用を検討してください。その場合は、OAuthを使用してTwitter APIとやりとりする必要はありません。
 

パラメーターの収集

ヘッダーには7つのキーと値のペアが含まれており、キーはすべて文字列「oauth_」で始まっていることを確認できるはずです。任意のTwitter APIリクエストに対して、これらの7つの値を収集し、同様のヘッダーを作成することによって、リクエストの認証を指定できます。それぞれの値は以下のように生成されます。

コンシューマーキー

oauth_consumer_keyは、どのアプリケーションがリクエストを行っているかを識別します。この値は、開発者ポータルTwitterアプリの設定ページから取得できます。

oauth_consumer_key xvz1evFS4wEEPTGEFPHBog

Nonce

oauth_nonceパラメーターは、アプリケーションが一意のリクエストごとに生成する必要がある一意のトークンです。Twitterはこの値を使用して、リクエストが複数回投稿されているかどうかを判断します。このリクエストの値は、32バイトのランダムデータをbase64でエンコードし、文字以外をすべて削除することによって生成されていますが、ここでは、比較的ランダムな英数字の文字列を生成するアプローチで問題ありません。

oauth_nonce kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg

署名

oauth_signatureパラメーターには、署名アルゴリズムを介して他のすべてのリクエストパラメーターと2つのシークレット値を実行することによって生成される値が含まれます。署名の目的は、リクエストが転送中に変更されていないことをTwitterが確認すること、リクエストを送信しているアプリケーションを確認すること、アプリケーションがユーザーのアカウントとやりとりする権限を持っていることを確認することにあります。

このリクエストのoauth_signatureを計算するプロセスは、「署名の作成」で説明されています。

oauth_signature tnnArxj06cWHq44gCs1OSKk/jLY=

署名メソッド

Twitterで使用されるoauth_signature_methodはHMAC-SHA1です。この値は、TwitterのAPIに送信した認証済みリクエストに使用されます。

oauth_signature_method HMAC-SHA1

日付と時間

oauth_timestampパラメーターは、リクエストがいつ作成されたかを示します。この値は、リクエストが生成された際のUnix時間からの秒数であるため、大部分のプログラミング言語で簡単に生成できるはずです。Twitterでは作成された時間があまりにも古いリクエストは拒否されてしまうため、リクエストを生成するコンピューターの時計をNTPと同期させておくことが重要です。

oauth_timestamp 1318622958

トークン

oauth_tokenパラメーターは、通常、自分のアカウントへのアクセスをアプリケーションと共有するためのユーザーの権限を表します。この値が渡されなかったり、トークンの形式が異なったりする認証リクエストがいくつかありますが、それらについては「アクセストークンの取得」で詳しく説明しています。汎用的なリクエストの大部分では、アクセストークンと呼ばれるものを使用します。

アカウントの有効なアクセストークンは、開発者ポータルTwitterアプリの設定ページで生成できます。

oauth_token 370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb

バージョン

Twitter APIに送信される任意のリクエストのoauth_versionパラメーターは常に1.0である必要があります。

oauth_version 1.0


ヘッダー文字列の構築

ヘッダー文字列を構築するために、DSTという名前の文字列に書き込むと想定します。

  1. 文字列「OAuth 」(最後のスペースを含む)をDSTに追加します。
  2. 上述の7つのパラメーターの各キー/値のペアについて:
    1. キーをパーセントエンコードしてDSTに追加します。
    2. 等号文字「=」をDSTに追加します。
    3. 二重引用符「”」をDSTに追加します。
    4. 値をパーセントエンコードしてDSTに追加します。
    5. 二重引用符「”」をDSTに追加します。
    6. キーと値のペアが残っている場合は、コンマ「,」とスペース「 」をDSTに追加します。

この文字列を作成する際には、値のパーセントエンコードに特に注意してください。たとえば、tnnArxj06cWHq44gCs1OSKk/jLY=oauth_signature値は、tnnArxj06cWHq44gCs1OSKk%2FjLY%3Dとエンコードされる必要があります。

上記で収集したパラメーターに対しこれらのステップを実行すると、以下のような文字列が生成されます。

OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog", oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg", oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1318622958", oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb", oauth_version="1.0"

この値はリクエストのAuthorizationヘッダーとして設定される必要があります。