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

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


```text
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の作成が出来ない。
まず、必要なパラメーターをキーでソートして並べる。以下、改行は見やすいように入れてるだけ。

```text
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種類となる。結果が以下の通り

```text
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
```

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

```text
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のパラメーターを追加する事。これの値部分を同じ条件でエスケープして

```text
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行にすればよし。

```text
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
```


## まとめ

まとめとして

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

という事であると。