C#(≒ .NET Framework)でTwitterAPI叩こうとしてOAuthが401エラー返してくれて困ってたのでメモっておく。
こちらにあるTwitterのOAuthを叩くコードを使おうとしたところまではよしとして、URLエンコードを自前でやっていたので何も考えずに Framework の System.Web.HttpUtility.UrlEncode に置き換えたのが悪かった。
リクエストトークン取りに行くところでTwitterが401を返すようになってしまってさーたいへん(棒)。
ソースの UrlEncode と System.Web.HttpUtility.UrlEncode の違いはエンコード出力の%エスケープされた16進表記が大文字か小文字(HttpUtility.UrlEncode)の差。これが問題になること無いだろと思ったけれど、よくよく調べていくと
- [観] OAuth のややこしいところ http://watcher.moe-nifty.com/memo/2009/03/oauth-7aaa.html
- [OAuth][twitter][.NET] C++/CLIでOAuth使ってtwitterにポストしたい その2 http://tokcs.com/blog/2010/05/17/oauth-twitter-dot_net-2/
で、OAuthの仕様でURLエンコード後の大文字小文字表記が決まってるとorz (google:「oauth urlエンコード」)
OAuth の oauth_signature を作るときは大文字16進表記でないとダメらしい。それで自前実装だったのね、、と。
OAuth の 仕様 の 5.1 パラメータエンコーディング にも明記してあったり。
またエンコードされた16進数の文字は、必ず大文字にしておく必要があります。