HaskellでOAuth(1): Request Token取得
追記)署名アルゴリズムに誤りがあったので訂正
HTTP通信のやり方を適当に抑えた所で、いよいよHaskellでOAuthプロトコル通信をやってみました。
大体は下のサイトあたりを参考にしました。
OAuthプロトコルの中身をざっくり解説してみるよ
http://d.hatena.ne.jp/yuroyoro/20100506/1273137673
HaskellでOAuthとTwitter API
http://d.hatena.ne.jp/kenkov/20110503/1304441705
が、ものすごく細かい仕様でハマりまくりましたので、ハマりポイントを晒します。
(1)Authorizationヘッダに設定する区切り文字は' & '(アンパサンド)ではなく' , '(コンマ)
→一つ目のサイトでは間違ってます。仕様変更?
(2)署名生成時、パラメータをURIエンコードするのは' & '、' = 'でつないだ後
→つまり、署名生成文字列には' & ' → ' %26 '、' = ' → ' %3D 'と変換されたものが入る。
(3)リクエストするURIは、SSH通信しないなら"https:/ ~ "ではなく"http:// ~ "
→これにハマりまくりました。提示されてる方はhttpsの方なので、駄目ならsをとって試したほうがいいかもです。
あとは、アプリのアクセス権限を"Read Only"から"Read and Write"に変更するとかも必要?
調べてみるとみなさん色々な所でUnauthorizedで弾かれているようです……
このくらいです。
実際、あんまり細かい書式には拘っていないようでした。コンマの後にスペース入れたり、パラメータのダブルクオートが無かったりしても平気でした。
署名生成のアルゴリズムとBase64エンコードはライブラリがあるのでそれを使用。
それぞれSHA1パッケージとdataencパッケージをcabalで取ってくる。
以下コード。OAuth型はとりあえず今回必要な分だけ。アクセストークンの値入れたりするフィールドは絶対いるけど。