Help us understand the problem. What is going on with this article?

Twitterでstatus/updateする時に必要なoauth_signatureの作成方法を再確認

More than 3 years have passed since last update.

oAuth認証の手順についての記述は結構あるんだけど、具体的に要所要所でダブルクオートを含むのか否かとか、どこまでurlエンコードするのかとか微妙な所が分からない。oAuth認証を自作する時はそこで躓いてしまう。
ので、ダミーのアプリケーションキー シークレット、アクセストークン シークレットを使って最終的にどんな値をpostするコードを書けばいいのかを再確認。これと同じ値を出力するコードを書けばそれで正しいはず!

apiKey=[y4qVHK3sRR3nKCEcpd5tK]
apiSec=[MDSh3uCZ8YqN757nXqTXc73qK4naMSFzFn5KKcenEC]
accToken=[123456-KEXVCyULJCcRZNynA8wjZjYGxbzJWpf2EVPVr5HcBx]
accSecret=[ckPHFFpQqQ4c2DUB6ZUMrmNfkuMnMNZALdYrGzVqdm]
url=[https://api.twitter.com/1.1/statuses/update.json]
method=[POST]
time=[1471303610]
nonce=[0.33412500 1471303610]
tweetText=[@fushihara てすと 2016/08/16 08:23 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ ❤❧]

sigKey=[MDSh3uCZ8YqN757nXqTXc73qK4naMSFzFn5KKcenEC&ckPHFFpQqQ4c2DUB6ZUMrmNfkuMnMNZALdYrGzVqdm]
sigData=[POST&https%3A%2F%2Fapi.twitter.com%2F1.1%2Fstatuses%2Fupdate.json&oauth_consumer_key%3Dy4qVHK3sRR3nKCEcpd5tK%26oauth_nonce%3D0.33412500%25201471303610%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1471303610%26oauth_token%3D123456-KEXVCyULJCcRZNynA8wjZjYGxbzJWpf2EVPVr5HcBx%26oauth_version%3D1.0%26status%3D%2540fushihara%2520%25E3%2581%25A6%25E3%2581%2599%25E3%2581%25A8%25202016%252F08%252F16%252008%253A26%2520%2521%2522%2523%2524%2525%2526%2527%2528%2529%252A%252B%252C-.%252F%253A%253B%253C%253D%253E%253F%2540%255B%255C%255D%255E_%2560%257B%257C%257D~%2520%25E2%259D%25A4%25E2%259D%25A7]
RequestHeader=[Authorization: OAuth oauth_consumer_key=y4qVHK3sRR3nKCEcpd5tK,oauth_nonce=0.33412500%201471303610,oauth_signature_method=HMAC-SHA1,oauth_timestamp=1471303610,oauth_token=123456-KEXVCyULJCcRZNynA8wjZjYGxbzJWpf2EVPVr5HcBx,oauth_version=1.0,oauth_signature=CzX46hb5zb51IbLo2HopHdxxtSE%3D]
postparameter=[status=%40fushihara+%E3%81%A6%E3%81%99%E3%81%A8+2016%2F08%2F16+08%3A26+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F%3A%3B%3C%3D%3E%3F%40%5B%5C%5D%5E_%60%7B%7C%7D%7E+%E2%9D%A4%E2%9D%A7]

sigDataについて

sigKeyはいいんだけど、sigDataは1バイトでも間違っていると正常なoauth_signatureの作成が出来ない。
まず、必要なパラメーターをキーでソートして並べる。以下、改行は見やすいように入れてるだけ。

oauth_consumer_key=y4qVHK3sRR3nKCEcpd5tK&
oauth_nonce=0.33412500 1471303610&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1471303610&
oauth_token=123456-KEXVCyULJCcRZNynA8wjZjYGxbzJWpf2EVPVr5HcBx&
oauth_version=1.0&
status=@fushihara てすと 2016/08/16 08:26 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ ❤❧]

これの値の部分をエスケープする。ケツについてる&はまだ無視。半角スペースが%20になって、てすと が%E3%81%A6 %E3%81%99 %E3%81%A8になってる。
加えて

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F%3A%3B%3C%3D%3E%3F%40%5B%5C%5D%5E_%60%7B%7C%7D~

という変換が行われている。つまり、エスケープされない文字は英数に加えて-_.~の4種類となる。結果が以下の通り

oauth_consumer_key=y4qVHK3sRR3nKCEcpd5tK&
oauth_nonce=0.33412500%201471303610&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1471303610&
oauth_token=123456-KEXVCyULJCcRZNynA8wjZjYGxbzJWpf2EVPVr5HcBx&
oauth_version=1.0&
status=%40fushihara%20%E3%81%A6%E3%81%99%E3%81%A8%202016%2F08%2F16%2008%3A26%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F%3A%3B%3C%3D%3E%3F%40%5B%5C%5D%5E_%60%7B%7C%7D~%20%E2%9D%A4%E2%9D%A7

そして、これ全体を同じ法則で再度エスケープ。この↑段階で存在する文字は英数+-_.~&%=のみと確定しているので、&%=をエスケープする事になる

oauth_consumer_key%3Dy4qVHK3sRR3nKCEcpd5tK%26
oauth_nonce%3D0.33412500%25201471303610%26
oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D1471303610%26
oauth_token%3D123456-KEXVCyULJCcRZNynA8wjZjYGxbzJWpf2EVPVr5HcBx%26
oauth_version%3D1.0%26
status%3D%2540fushihara%2520%25E3%2581%25A6%25E3%2581%2599%25E3%2581%25A8%25202016%252F08%252F16%252008%253A26%2520%2521%2522%2523%2524%2525%2526%2527%2528%2529%252A%252B%252C-.%252F%253A%253B%253C%253D%253E%253F%2540%255B%255C%255D%255E_%2560%257B%257C%257D~%2520%25E2%259D%25A4%25E2%259D%25A7

そして&%=から%を除く&=が消える。よって最終的に英数と%-_.~の記号のみのテキストを得ることが出来る。

これに、postメソッドやURLをエスケープした値と&でくっつけてsigDataの完成!

RequestHeader Authorization

ここまで来たらほぼ同じ。違いは、status等の認証とは関係ないパラメータが無い事、計算して求めたoauth_signatureのパラメーターを追加する事。これの値部分を同じ条件でエスケープして

oauth_consumer_key=y4qVHK3sRR3nKCEcpd5tK
oauth_nonce=0.33412500 1471303610
oauth_signature_method=HMAC-SHA1
oauth_timestamp=1471303610
oauth_token=123456-KEXVCyULJCcRZNynA8wjZjYGxbzJWpf2EVPVr5HcBx
oauth_version=1.0
oauth_signature=CzX46hb5zb51IbLo2HopHdxxtSE=

カンマで区切って1行にすればよし。

oauth_consumer_key=y4qVHK3sRR3nKCEcpd5tK
oauth_nonce=0.33412500%201471303610
oauth_signature_method=HMAC-SHA1
oauth_timestamp=1471303610
oauth_token=123456-KEXVCyULJCcRZNynA8wjZjYGxbzJWpf2EVPVr5HcBx
oauth_version=1.0
oauth_signature=CzX46hb5zb51IbLo2HopHdxxtSE%3D

まとめ

まとめとして

  • 値を"で囲う処理は存在しない
  • -_.~の記号はエスケープしない。それ以外は半角スペース含めてすべてする

という事であると。

Fushihara
javascript,nodejs,C#,powerShell,JAVA,php,js,html
https://twitter.com/Fushihara
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away