2010年05月14日

OAuth への道――具体的な送信内容

さて、Bot 限定でなんとか、必要なキーを入手することができました。
入手できたキー情報は4個
Bot の場合、キーの入手がかなりお手軽なので本当に助かりました。

Consumer key: aaaaaaaaaaaaaaaaaaaaaa
Consumer secret: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
Access Token: cccccccccccccccccccccccccccccccccccccccccccccccccc
Access Token Secret: ddddddddddddddddddddddddddddddddddddddddddd

※このキーは架空のものです。もうちょっとそれらしいものをでっち上げたかったのですが……。

これをもとに、ヘッダを作成します。

必要な処理は

・URL Encode …… とりあえず自作。
・HMAC-SHA1 および、BASE64 によるシグネチャーの作成 …… ソースを取ってきました。
・Unix Time の算出 …… とりあえず自作。Turbo C++ にある、TDateTime 型から変換。

私の場合、「節気さんシリーズ」を動かすことが目的なので、とにかく、POST ができればいいという、そういう方針でまいります。

【HTTP ヘッダ】

POST http://api.twitter.com/1/statuses/update.xml HTTP/1.1
Host: api.twitter.com
Content-type: application/x-www-form-urlencoded
Authorization: OAuth oauth_nonce="777ccc777",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1273672200",
oauth_consumer_key="aaaaaaaaaaaaaaaaaaaaaa",
oauth_token="cccccccccccccccccccccccccccccccccccccccccccccccccc",
oauth_signature="xxxxxxxxxxxxxxxxxxxxxxxxxxx%3D",
oauth_version="1.0"
Content-Length: 135

※上記の oauth_nonce= から、 oauth_version="1.0" までは実際には一行です。(改行は入りません)

oauth_nonce="777ccc777",
―― ランダムな文字列です。このあとの、timestamp と併せて、リクエストの一意性を確保するためです。

oauth_signature_method="HMAC-SHA1",
―― シグネチャーの生成方式で、Twitter では、これに限定されます。

oauth_timestamp="1273672200",
―― リクエストを発行した時刻です。Unix Time とよばれるもので、
1970年1月1日00:00:00(UTC)からの通算秒です。
      この時刻から、5分間は有効らしいです。
      あとで第三者に「再利用」されないための処置です。

oauth_consumer_key="aaaaaaaaaaaaaaaaaaaaaa",
oauth_token="cccccccccccccccccccccccccccccccccccccccccccccccccc",
―― これは、既に入手しているキーになります。

oauth_signature="xxxxxxxxxxxxxxxxxxxxxxxxxxx%3D",
―― これが、シグネチャーでして、まあ、鬼門だと思います。

oauth_version="1.0"
―― これも、現時点では、1.0 に固定です。

【先に、HTTP Body の方を……】

Twitter に投稿するための、「投稿内容」です。
実は、シグネチャーの生成には、この内容も含まれます。

status=(UTF-8 で書いたものを、ERL エンコードした文字列)

です。

ここでは、簡単に

status=abcd

としておきます(これだと、実質的にエンコードの必要がない)

【シグネチャーの生成】

さて、いよいよ、シグネチャーの生成です。
シグネチャーは、「Base String」を、「key」によって、HMAC-SHA1 で変換したものを、さらに、BASE64 で変換したものです。

● Base String とは……

ここでは、POST 処理を考えていますので、

POST
&
http%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.xml
&
oauth_consumer_key%3Daaaaaaaaaaaaaaaaaaaaaa
%26
oauth_nonce%3D777ccc777
%26
oauth_signature_method%3DHMAC-SHA1
%26
oauth_timestamp%3D1273672200
%26
oauth_token%3Dcccccccccccccccccccccccccccccccccccccccccccccccccc
%26
oauth_version%3D1.0
%26
status%3Dabcd

となります。
実際には、これを改行無しで1行にしたものです。
所々見えている、%3D は = を、%26 は、& をそれぞれ URL Encode したものです。
また、そのまま & になっている部分もあります(POST の直後と、http://api.twitter/1/statuses/update.xml の直後)

あと、順番にも注意が必要です。パラメータがアルファベット順に並ぶようにします。(この順番はそうなっています)

● Key とは……

ここまで使っていなかった、secret の出番です。
キーは、Consumer secret と Access Token Secret を & でつないだものです。
つまり、

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb&ddddddddddddddddddddddddddddddddddddddddd

がキーになります。

● これを、HMAC-SHA1 と BASE64 で整形する。

実際の処理は、理解できませんでした。
ソースを、 http://www.koders.com/c/fid645718469E4742143926FA6138FC7FD33BBD3A4F.aspx から入手しました。
使用したのは、base64.h base64.c hmac.h hmac_sh1.c memxor.h memxor.c sha1.h sha1.c です。

この例で計算すると、 lJdZXD19quOrpHsxMzfaM0WWkW8%3D になるようです。

急ぎ足ですが、まずは、一通りやってみたところで。
posted by 麻野なぎ at 23:54| Comment(0) | TrackBack(0) | Twitter と Bot の周辺
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/38085643

この記事へのトラックバック