TwitterのOAuthリクエスト用パラメーターを準備する
この記事は以下の環境が対象です:
- .NET Framework 4.5
Twitter APIに対してOAuthの認証を要求したり認証済みのリクエストを送る場合、さまざまなパラメーターを1つの文字列として連結してリクエストに含める必要がありますが、この際すべてのパラメーターのキーと値をパーセントエンコードしてアルファベット順に連結する必要があります。
と言うことで、プログラム内で取得したパラメーターはすべて事前にパーセントエンコードしてSortedDictionaryに入れておくのが楽かなぁと思い、以下のようにしてみました。
/// <summary> /// パラメーター名および値をパーセントエンコードしてディクショナリに追加 /// </summary> private void AddPercentEncodedItem(SortedDictionary<string, string> dictionary, string key, string keyValue) { dictionary.Add(Uri.EscapeDataString(key), Uri.EscapeDataString(keyValue)); }
ちなみに、.Net FrameworkのUri.EscapeDataStringメソッドは4.0までは問題がある(IRIを有効にしてもRFC 3986に準拠できない?)ようでTwitter APIの仕様であるRFC 3986に準拠したエンコーディングが行えないようで独自に実装する方法が主流のようです。
.NET Framework 4.5ではこの問題は解決されているようで、特に意識せずUri.EscapeDataStringを使用してリクエストを生成することができました。
使用例:
//パラメーターディクショナリの作成 SortedDictionary<string, string> paramDictionary = new SortedDictionary<string, string>(); //パラメーターの追加 AddPercentEncodedItem(paramDictionary, _pName_oauth_consumer_key, _oauth_consumer_key); AddPercentEncodedItem(paramDictionary, _pName_oauth_nonce, GenerateNonce()); AddPercentEncodedItem(paramDictionary, _pName_oauth_signature_method, "HMAC-SHA1"); AddPercentEncodedItem(paramDictionary, _pName_oauth_timestamp, GenerateTimeStamp()); AddPercentEncodedItem(paramDictionary, _pName_oauth_token, oauth_token); AddPercentEncodedItem(paramDictionary, _pName_oauth_version, "1.0"); //シグネチャを生成しパラメーターに追加 string signature = GenerateSignature(paramDictionary, _updateStatusUrl, oauth_token_secret); AddPercentEncodedItem(paramDictionary, _pName_oauth_signature, signature);