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

署名の作成

このページでは、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 のリクエストでは、HTTP メソッドはほとんどの場合 GET または POST になります。
HTTP MethodPOST
ベース URL とは、クエリ文字列や hash パラメータを除いた、リクエストの送信先となる URL のことです。ここでは正しいプロトコルを使用することが重要なため、URL の「https://」の部分が API に送信される実際のリクエストと一致していることを確認してください。
Base URLhttps://api.x.com/1.1/statuses/update.json

パラメータの収集

次に、リクエストに含まれるすべてのパラメータを収集します。これらの追加パラメータは2か所にあります。URL(query 文字列の一部)とリクエストボディです。サンプルリクエストには、両方の場所にそれぞれ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_* パラメータを署名に含める必要があるため、それらも収集してください。以下はリクエストの認可からのパラメータです:
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 仕様では「signature base string(署名ベース文字列)」と呼ばれます。 HTTP メソッド、ベース URL、パラメータ文字列を1つの文字列にエンコードするには:
  1. HTTP メソッドを大文字に変換し、その値を出力文字列とします。
  2. 出力文字列に「&」文字を追加します。
  3. URL をパーセントエンコードし、出力文字列に追加します。
  4. 出力文字列に「&」文字を追加します。
  5. パラメータ文字列をパーセントエンコードし、出力文字列に追加します。  
これにより、次の「signature base string(署名ベース文字列)」が得られます:
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 としてエンコードする必要があります。

署名キーの取得

最後に収集するdataは、リクエストを送信するX appおよびそのリクエストが代行するユーザーを識別するためのシークレットです。これらの値は極めて機密性が高く、決して第三者と共有しないでください。 あなたのアプリをXに識別させる値はconsumer secretと呼ばれ、developer portalapp details pageで確認できます。これは、あなたのX Appが送信するすべてのリクエストで同一です。
Consumer secretkAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw
あなたのアプリケーションが代行するアカウントを識別する値はOAuth token secretと呼ばれます。この値は複数の方法で取得でき、詳細はobtaining access tokensに記載されています。
OAuth token secretLswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE
重ねて強調しますが、これらの値はアプリケーション内で厳重に秘匿してください。値が漏えいしたおそれがある場合はトークンを再生成してください(このページのトークンは実際のリクエストでは無効化されています)。 これら2つの値を組み合わせてsigning keyを作成し、署名の生成に使用します。signing keyは、単にpercent encodedされたトークンシークレットです。 なお、request tokenを取得するなど、トークンシークレットがまだ不明なフローもあります。この場合、signing keyはpercent encodedされたconsumer secretの後にアンパサンド記号 ‘&’ を付けたものにしてください。
Signing keykAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&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 署名Ls93hJiZbQ3akF3HF3x1Bz8/zU4=
I