サイトのトップへ戻る

Twitter 開発者 ドキュメント日本語訳

署名を作成する



概要

このページではHTTPリクエストで使うOAuth 1.0a HMAC-SHA1署名の生成方法について説明します。 リクエストを承認するのページで説明したように、署名は承認済みリクエストの一部としてTwitter APIへ送信するのに適しています。

POST to https://api.twitter.com/1/statuses/update.jsonへのリクエストを署名する処理を例にとって説明します。 リクエストの原物は以下のようになります:

POST /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.twitter.com

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


リクエストメソッドとURLを準備する

署名を作成するには、まずHTTPメソッドとリクエストURLを決めるところから始めます。これら二つはリクエストを作成する時に分かるので、取得するのは簡単です。

Twitter API リクエストの場合、リクエストメソッドは大抵 GETPOST です。

HTTP メソッド POST

ベースURLとは、リクエストが送られるURLからクエリー文字列やハッシュパラメータを取り除いたURLです。 ここでは正しいプロトコルを使うことが重要なので、“https://” や “http://”といったURLのプロトコル部分を、実際にAPIへ送信するリクエストと一致させるようにしてください。 ベストプラクティスとして、 Twitter APIでは “https://” を使うようにしてください。

ベース URL https://api.twitter.com/1/statuses/update.json


各パラメータを集める

次に、リクエストに設定するパラメータを全て用意します。 There are two such locations for these additional parameters - the URL (as part of the querystring) and the request body. The sample request includes a single parameter in both locations (shown in bold):

POST /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.twitter.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. パラメータをエンコードしたキー[2]のアルファベット順[1]に並び替えます。
  3. 各キー/値のペアについて、以下の手順を繰り返します:
  4. エンコードされたキーを出力文字に追加します。
  5. ‘=’ 文字を出力文字に追加します。
  6. エンコードされた値を出力文字に追加します。
  7. 他にキーとの組み合わせが残っている場合は、‘&’文字を出力文字列に追加します。

[1] 注意: OAuth の仕様では says to sort lexigraphically, which is the default alphabetical sort for many libraries.

[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


署名ベース文字列を作成する

これまでに集めた三つの値を、署名の生成元となる文字列を作るために結合する必要があります。これはOAuth の仕様では 署名ベース文字列 と呼ばれます。

HTTP メソッドとベースURLとパラメータ文字列を一つの文字列にエンコードするには:

  1. HTTPメソッドを大文字に変換し、この値に設定します。
  2. 上記に ‘&’ 文字を追加します。
  3. URLをパーセントエンコードし、上記に追加します。
  4. 上記に ‘&’ 文字を追加します。
  5. パラメータ文字列をパーセントエンコードし、上記に追加します。

そうすると以下の文字列が出来上がります:

署名ベース文字列
POST&https%3A%2F%2Fapi.twitter.com%2F1%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

パラメータ文字列は必ずパーセントエンコードするようにしてください! 署名ベース文字列では必ずアンパサンド文字 ‘&’ を二つ含むようにしてください。 パラメータ文字列のパーセント文字 ‘%’ は、署名ベース文字列では %25 とエンコードするようにしてください。



署名キーを取得する

集めるデータの最後の一つは、リクエストを作成するアプリケーションとリクエストするユーザーを識別するための秘密情報です。 これらは非常にデリケートな情報なので、他人に絶対に知られないよう注意することがとても重要です。

Twitter があなたのアプリケーションの識別に使うこの値は利用者秘密情報(consumer secret) と呼ばれ、dev.twitter.com/appsへ行ってアプリケーションの設定ページを開くと見つけることができます。これはアプリケーションで送信する全てのリクエストで当てはまります。

利用者秘密情報 kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw

あなたのアプリケーションが使用するアカウントを識別する値はoauth トークン秘密情報(oauth token secret)と呼ばれます。 この値は様々は方法で取得することができ、アクセストークンを取得するのページでその方法を全て説明しています。

OAuth トークン秘密情報 LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE

もう一度言いますが、これらの値はあなたのアプリケーション内部でのみ使用するようにしてください。 これらが漏洩していると感じた場合は、トークンを再生成してください (このページに記載されているトークンは、実際のリクエストでは使用できないものです)。

これら二つの値をつなぎ合わせて、署名を生成するために使う署名キー(signing key)を作る必要があります。 署名キーは、単純にパーセントエンコードした利用者秘密情報の後ろにアンパサンド文字‘&’を付け、その後ろにパーセントエンコードしたトークン秘密情報を付けただけです:

リクエストトークンを取得する場合のように、トークン情報が分からないフローもいくつかあるので注意してください。 そのような場合は、署名キーはパーセントエンコードした利用者秘密情報の後ろにアンパサンド文字‘&’を付ける形式にして下さい。

署名キー
kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE


署名を算出する

最後に、署名ベース文字列と署名キーをHMAC-SHA1ハッシュアルゴリズムに渡すことで署名を算出します。 このアルゴリズムの詳細はin depth hereで説明していますが、ありがたいことに全ての有名どころのプログラム言語では HMAC-SHA1の実装がされています。例えば、 PHP には hash_hmac 関数があります。

HMAC 署名関数の出力結果はバイナリ文字列になります。そのため base64 エンコードして署名文字列を作成する必要があります。 例えば、このページのベース文字列と署名キーを使った場合の出力結果は B6 79 C0 AF 18 F4 E9 C5 87 AB 8E 20 0A CD 4E 48 A9 3F 8C B6 となります。 この値をbase64へ変換した場合、以下のようなOAuth 署名になります:

OAuth signature tnnArxj06cWHq44gCs1OSKk/jLY=