メインコンテンツへスキップ

署名の作成

このページでは、HTTP リクエストに対する OAuth 1.0a HMAC-SHA1 署名の生成方法を説明します。この署名は、リクエストの認可で説明されているとおり、認可済みリクエストの一部として X 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つはリクエストを作成する時点で判明しているため、取得は容易です。 X API のリクエストでは、リクエストメソッドはほとんどの場合 GET か POST です。
HTTP MethodPOST
ベースURLは、クエリ文字列やハッシュパラメータを除いた、リクエストの送信先となるURLです。ここでは正しいプロトコルを使用することが重要なため、URLの「https://」の部分がAPIに送信される実際のリクエストと一致していることを確認してください。

パラメータの収集

次に、リクエストに含まれるすべてのパラメータを収集します。これらの追加パラメータが存在し得る場所は2つあります。URL(クエリ文字列)とリクエストボディです。サンプルリクエストでは、両方の場所にそれぞれ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=こんにちは%20レディーの皆様%20%2b%20ジェントルマンの皆様%2c%20署名済み%20OAuth%20リクエストです%21
HTTP リクエストには URL エンコードされたパラメータがありますが、生の値を収集する必要があります。リクエストパラメータに加えて、すべての oauth_* パラメータを署名に含める必要があるため、それらも収集してください。こちらはリクエストの認可からのパラメータです:
statusHello Ladies + Gentlemen, a signed OAuth request!
include_entitiestrue
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
oauth_signature_methodHMAC-SHA1
oauth_timestamp1318622958
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
oauth_version1.0
これらの値は 1 つの文字列にエンコードし、後で使用します。文字列を構築する手順は非常に厳密です:
  1. 署名対象となるすべてのキーと値をパーセントエンコードします。
  2. エンコード済みキーに基づいて、パラメータ一覧をアルファベット順に[1]ソートします[2]
  3. 各キー/値ペアについて:
  4. 出力文字列にエンコード済みキーを追加します。
  5. 出力文字列に‘=’文字を追加します。
  6. 出力文字列にエンコード済み値を追加します。
  7. まだ残りのキー/値ペアがある場合は、出力文字列に‘&’文字を追加します。  
[1] OAuth 仕様では辞書式順序でソートするとされています。これは多くのライブラリでのデフォルトのアルファベット順ソートです。 [2] エンコード済みキーが同じ 2 つのパラメータがある場合、OAuth 仕様では値に基づいてソートを続行するとされています。ただし、X は API リクエストで重複したキーを受け付けません   パラメータ文字列 上記で収集したパラメータに対してこれらの手順を繰り返すことで、次の「パラメータ文字列」が生成されます:
statusHello Ladies + Gentlemen, a signed OAuth request!
include_entitiestrue
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
oauth_signature_methodHMAC-SHA1
oauth_timestamp1318622958
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
oauth_version1.0

署名ベース文字列の作成

これまでに収集した3つの値を結合して1つの文字列にし、そこから署名を生成します。OAuth仕様では、これを署名ベース文字列と呼びます。 HTTPメソッド、ベースURL、パラメータ文字列を1つの文字列にまとめるには:
  1. HTTPメソッドを大文字に変換し、その値を出力文字列とします。
  2. 出力文字列に‘&’文字を追加します。
  3. URLをパーセントエンコードし、出力文字列に追加します。
  4. 出力文字列に‘&’文字を追加します。
  5. パラメータ文字列をパーセントエンコードし、出力文字列に追加します。  
これにより、次の署名ベース文字列が得られます:
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」にエンコードしてください。

署名鍵の取得

収集すべき最後のデータは、リクエストを送信するX アプリを識別するシークレットと、リクエストの対象となるユーザーを識別するシークレットです。これらの値は極めて機微な情報であり、決して第三者と共有しないでください。 あなたのアプリを X に識別させる値は「コンシューマーシークレット」と呼ばれ、開発者ポータルアプリ詳細ページで確認できます。これは、あなたの X アプリが送信するすべてのリクエストで同一です。
コンシューマーシークレットkAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw
あなたのアプリケーションが代理で操作するアカウントを識別する値は「OAuth トークンシークレット」と呼ばれます。この値は複数の方法で取得でき、詳細はユーザーアクセス・トークンの取得で説明しています。
OAuth トークンシークレットLswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE
改めて、これらの値はアプリケーション専用として厳重に管理してください。漏えいの可能性があると感じた場合は、トークンを再生成してください(このページのトークンは実際のリクエストでは無効になるようマークされています)。 これら2つの値は組み合わせて、署名の生成に使用する「署名鍵」を形成する必要があります。署名鍵は、パーセントエンコードされたトークンシークレットを連結したものです。 なお、リクエストトークンの取得時など、トークンシークレットがまだ不明なフローもあります。この場合、署名鍵はパーセントエンコードされたコンシューマーシークレットの後に、アンパサンド文字「&」を続けたものにしてください。
署名鍵kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE

署名の計算

最後に、署名ベース文字列と署名キーを HMAC-SHA1 ハッシュアルゴリズムに渡して署名を計算します。アルゴリズムの詳細は hash_hmac 関数で説明されています。 HMAC 署名関数の出力はバイナリ文字列です。これを base64 エンコードして署名文字列を生成する必要があります。たとえば、このページで示したベース文字列と署名キーを用いた出力は 2E CF 77 84 98 99 6D 0D DA 90 5D C7 17 7C 75 07 3F 3F CD 4E です。この値を base64 に変換すると、このリクエストの OAuth 署名になります:
OAuth signatureLs93hJiZbQ3akF3HF3x1Bz8/zU4=