このページでは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
署名を作成するには、まずHTTPメソッドとリクエストURLを決めるところから始めます。これら二つはリクエストを作成する時に分かるので、取得するのは簡単です。
Twitter API リクエストの場合、リクエストメソッドは大抵 GET
か POST
です。
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] 注意: 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とパラメータ文字列を一つの文字列にエンコードするには:
そうすると以下の文字列が出来上がります:
署名ベース文字列 |
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= |