- 前提: OAuth version 1.0a, Twitter API 1.1
OAuth 認証を通じてツイートするためには、API に対して POST する際、リクエストヘッダに Authorization フィールドを含める必要がある。
逆にいえば、リクエストヘッダの Authorization フィールドに正しい値を含めさえすれば、POST が通る。
Authorization フィールドの値のうち、いくつかの値を生成するのに 4 つの key, token が必要となる。これらは全て ASCII 文字列である。
- Consumer key
- Consumer key secret
- Access token
- Access token secret
以下に、これら 4 つの key, token の概要を記す。
- Consumer key = クライアント識別情報
- Consumer key secret = Authorization フィールドの oauth_signature 値を生成する際の計算のみに用いる
上記 2 つの key は、Twitter Developers のサイト上で取得できる。
My applications | Twitter Developers (https://dev.twitter.com/apps) にアクセス、ログイン後、クライアント(アプリケーションが実在するかどうかは問わない)の登録を行うことで、サイトに表示される。
- Access token = ユーザー識別情報
- Access token secret = Authorization フィールドの oauth_signature 値を生成する際の計算のみに用いる
上記 2 つの token は、Twitter API の OAuth 認証用 API を通じて取得する必要がある。ステップは 3 つある。
まず、Request token, Request token secret を取得する
- API: https://api.twitter.com/oauth/request_token へ POST する
- この API においても、リクエストヘッダに Authorization フィールドを 含める必要がある
- 値の生成には Consumer key, Consumer key secret が必要だ
この API の戻り値に Request token, Request token secret が含まれている
次に、oauth_verifier を取得する
- API: https://api.twitter.com/oauth/authorize を GET する
- クエリとして ?oauth_token= に Request token をセットする
- この URL をブラウザで開くと、Twitter クライアント認証画面が表示される
- ログインして、認証ボタンを押す
- すると、コールバック URL 先に自動リダイレクトされる
コールバック URL は、以下のようにして指定できる
* A. dev.twitter.com/apps で予め設定しておく
* B. STEP 1 において Authorization フィールドに oauth_callback を付加する
A, B 両方ともに設定した場合は、後者 B の URL が優先される
コールバック URL のクエリに oauth_verifier が付加されている
Access token, Access token secret を取得する
- API: https://api.twitter.com/oauth/access_token へ POST する
- この API においても、リクエストヘッダに Authorization フィールドを 含める必要がある
- 値の生成には Consumer key, Consumer key secret, Request token, Request token secret, oauth_verifier が必要だ
この API の戻り値に Access token, Access token secret が含まれている
- oauth_consumer_key: "uMXCp2EcMQkvs5YnzFBnr"
- Consumer key の値をセットする
- oauth_nonce: "hoge"
- てきとうな文字数で、てきとうな文字列をセットする
- oauth_timestamp: "1364640770"
- タイムスタンプをセットする
- JavaScript の
Math.floor(Date.now()/1000)
と等しい - 現時点の Twitter API では 30 分程度の誤差が許容される
- oauth_version: "1.0"
- 使用する OAuth のバージョンをセットする
- oauth_signature_method: "HMAC-SHA1"
- oauth_signature 値の生成に使用したハッシュ関数の名称をセットする
- oauth_signature: "+9sdGxiqbAgyS31ktx+3Y3BpDh0="
- HMAC-SHA1 関数 + Base-64 により生成した文字列をセットする
Authorization フィールドの 1 つに oauth_signature というものがある。 ここにセットする値は、HMAC-SHA1 というハッシュ関数を用いて生成する。
HMAC-SHA1 とは HMAC と SHA1 という 2 種類の関数が合わさったものだ。
- まず、OAuth の仕様通りの手順にしたがって SHA1 で値 A を生成する。
- 次に、値 A および SHA1 関数自体を、HMAC 関数に入れて、値 B を生成する。
- 最後に、値 B を Base-64 でエンコードして値 C を生成する。
- 値 C を oauth_signature の値としてセットする。
- 擬似コード
function HMAC-SHA1(key, text) {
IPAD = [0x36,..]
OPAD = [0x5C,..]
return SHA1((key XOR OPAD) concat SHA1((key XOR IPAD) concat text))
}
HMAC-SHA1 を実装するのに、以下のサイトを参考にした
-
RFC 3174 - US Secure Hash Algorithm 1 (SHA1)
http://tools.ietf.org/html/rfc3174
SHA1 の仕様書 -
SHA-1の計算方法 - BK class
http://www14.ocn.ne.jp/~bkclass/doc_sha1.html
SHA1 関数を自作する方法がソースコード付きで解説されている -
crypt.js Overview
http://stefan-strigler.de/jsjac-1.3.2/doc/overview-summary-crypt.js.html
JavaScript による HMAC-SHA1 等の実装
ソースコードが書かれている -
jsSHA - SHA Hashes in JavaScript
http://caligatio.github.com/jsSHA/
JavaScript による HMAC-SHA1 等の実装
サイトの インプットボックス にテキストを入力すると、
ハッシュ関数により生成された値を文字列化したものが表示される -
RFC2104 - HMAC: Keyed-Hashing for Message Authentication
http://tools.ietf.org/html/rfc2104
HMAC の仕様書 -
Hash-based message authentication code - Wikipedia
http://en.wikipedia.org/wiki/Hash-based_message_authentication_code
Wikipedia の HMAC のページ
図 (http://en.wikipedia.org/wiki/File:Shahmac.jpg) が明瞭
OAuth 認証処理の一部を実装するのに、以下のサイトを参考にした
-
The OAuth 1.0 Protocol
http://openid-foundation-japan.github.com/draft-hammer-oauth-10.html
OAuth 1.0 仕様書の日本語訳 -
OAuth(Twitter API) - PukiWiki
http://wiki.100poisha.ddls.jp/index.php?OAuth(Twitter%20API)
OAuth 認証 Twitter クライアントの作成方法
各種 token の取得方法、その手順がソースコード付きで解説されている -
Implementing Sign in with Twitter | Twitter Developers
https://dev.twitter.com/docs/auth/implementing-sign-twitter
OAuth 認証における処理の流れが、リクエストヘッダの値や
レスポンスで取得できる値と共に図解付きで書かれている