署名の作成
このページでは、HTTPリクエストのOAuth 1.0a HMAC-SHA1署名を生成する方法を説明します。この署名は、「リクエストの認証」で説明したように、認可されたリクエストの一部としてTwitter APIに渡す場合に適しています。
署名の説明に使用するリクエストは、https://api.x.com/1.1/statuses/update.jsonへのPOSTです。加工前のリクエストは次のようになります。
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
リクエストメソッドとURLの収集
署名を作成するには、最初にリクエストのHTTPメソッドとURLを決定します。これら2つはリクエストを作成する際に分かるため、簡単に入手できます。
Twitter APIリクエストの場合、リクエストメソッドはほぼ必ずGETかPOSTになります。
HTTPメソッド | POST |
ベースURLは、リクエストが転送されるURLから、すべてのクエリ文字列またはハッシュパラメーターを取り除いたものになります。ここでは正しいプロトコルを使用することが重要です。URLの「https://」の部分がAPIに送信される実際のリクエストと一致していることを確認してください。
ベースURL | https://api.x.com/1.1/statuses/update.json |
パラメーターの収集
次に、リクエストに含まれるすべてのパラメーターを収集します。これらの追加パラメーター向け、つまりURL(クエリ文字列の一部)とリクエスト本文向けに2つのロケーションがあります。次のサンプルリクエストには、それぞれのロケーションに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
Content-Length:76
Host: api.x.com
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
HTTPリクエストにはURLエンコードされたパラメーターがありますが、未加工の値を収集する必要があります。リクエストパラメーターに加えて、すべてのoauth_*パラメーターを署名に含める必要があるため、これらも収集します。以下は、「リクエストの認証」のパラメーターになります。
パラメーター | サンプル値 |
status | Hello Ladies + Gentlemen, a signed OAuth request! |
include_entities | true |
oauth_consumer_key | xvz1evFS4wEEPTGEFPHBog |
oauth_nonce | kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg |
oauth_signature_method | HMAC-SHA1 |
oauth_timestamp | 1318622958 |
oauth_token | 370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb |
oauth_version | 1.0 |
これらの値は1つの文字列にエンコードする必要があります。これは、後で使用します。文字列を構築するプロセスは以下のように非常に具体的です。
- 署名されるすべてのキーと値をパーセントエンコードします。
- パラメーターのリストをエンコードされたキー [2] でアルファベット順 [1] に並べ替えます。
- それぞれのキーと値のペアに対して:
- 出力文字列にエンコードされたキーを追加します。
- 出力文字列に「=」を追加します。
- 出力文字列にエンコードされた値を追加します。
- キーと値のペアがまだ残っている場合は、出力文字列に「&」を追加します。
[1] OAuthの仕様では、これは多くのライブラリで、デフォルトでアルファベット順となっている辞書式順序で並べ替えると規定されています。
[2] 2つのパラメーターが同じエンコードされたキーを持つ場合、OAuth仕様では引き続き値に基づいて並べ替えるように規定されています。ただし、TwitterではAPIリクエストで重複するキーは使用できません。
パラメーター文字列
以上で収集したパラメーターを用いてこれらの手順を繰り返すことにより、以下のパラメーター文字列が生成されます。
include_entities=true&oauth_consumer_key=xvz1evFS4wEEPTGEFPHBog&oauth_nonce=kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1318622958&oauth_token=370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb&oauth_version=1.0&status=Hello%20Ladies%20%2B%20Gentlemen%2C%20a%20signed%20OAuth%20request%21
署名ベース文字列の作成
これまでに収集した3つの値を結合して1つの文字列を作り、そこから署名を生成する必要があります。これはOAuth仕様では署名ベース文字列と呼ばれます。
HTTPメソッド、ベースURL、パラメーター文字列を1つの文字列にエンコードするには以下を実行します。
- HTTPメソッドを大文字に変換し、出力文字列をこの値に設定します。
- 出力文字列に「&」を追加します。
- URLをパーセントエンコードし、出力文字列に追加します。
- 出力文字列に「&」を追加します。
- パラメーター文字列をパーセントエンコードし、出力文字列に追加します。
これにより、以下の署名ベース文字列が生成されます。
POST&https%3A%2F%2Fapi.x.com%2F1.1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521
パラメーター文字列は必ずパーセントエンコードしてください。署名ベース文字列には、アンパサンド「&」文字が必ず2つ含まれます。パラメーター文字列のパーセンテージ「%」文字は、署名ベース文字列で、%25としてエンコードする必要があります。
署名キーの取得
最後に、リクエストをするTwitterアプリと、リクエストを代行するユーザーを識別するシークレットのデータを収集します。これらの値は秘密性が非常に高いことに留意することが非常に重要です。決して誰とも共有しないようにしてください。
Twitterでアプリを識別する値はコンシューマーシークレットと呼ばれ、開発者ポータルでアプリ詳細ページを表示して確認できます。これは、Twitterアプリが送信するすべてのリクエストで同様です。
コンシューマーシークレット | kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw |
アプリケーションが代行するアカウントを識別する値は、OAuthトークンシークレットと呼ばれます。この値はいくつかの方法で取得できますが、「アクセストークンの取得」にすべての方法が記載されています。
OAuthトークンシークレット | LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE |
繰り返しになりますが、これらの値はアプリケーション以外には公開しないでください。値が侵害されていると感じた場合は、トークンを再生成します(このページのトークンは実際のリクエストでは無効とマークされています)。
これらの値の両方を組み合わせて、署名の生成に使用する署名キーを作成する必要があります。署名キーは、単純にパーセントエンコードされたコンシューマーシークレットに、アンパサンド文字「&」、パーセントエンコードされたトークンシークレットが追加されたものです。
なお、リクエストトークンを取得する場合など、その時点ではトークンシークレットが分からないいくつかのフローもあります。この場合、署名キーは、パーセントエンコードされたコンシューマーシークレットと、それに続くアンパサンド文字「&」で構成される必要があります。
署名キー | kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE |
署名の計算
最後に、署名ベース文字列と署名キーをHMAC-SHA1ハッシュアルゴリズムに渡すことによって署名が計算されます。アルゴリズムの詳細はhash_hmac関数として説明されます。
HMAC署名関数の出力はバイナリー文字列で、署名文字列を生成するためにbase64エンコードする必要があります。たとえば、このページのベース文字列と署名キーの出力は、84 2B 52 99 88 7E 88 7602 12 A0 56 AC 4E C2 EE 16 26 B5 49となります。この値をbase64に変換すると、このリクエストのOAuth署名になります。
OAuth署名 | hCtSmYh+iHYCEqBWrE7C7hYmtUk= |