public static class OAuthUtility
{
/// <summary>
- /// OAuth署名のoauth_timestamp算出用基準日付(1970/1/1 00:00:00)
- /// </summary>
- private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Unspecified);
-
- /// <summary>
/// OAuth署名のoauth_nonce算出用乱数クラス
/// </summary>
private static readonly Random NonceRandom = new Random();
string realm = null)
{
// OAuth共通情報取得
- Dictionary<string, string> parameter = GetOAuthParameter(consumerKey, token);
+ var parameter = GetOAuthParameter(consumerKey, token);
// OAuth共通情報にquery情報を追加
if (query != null)
- foreach (KeyValuePair<string, string> item in query)
- parameter.Add(item.Key, item.Value);
+ foreach (var (key, value) in query)
+ parameter.Add(key, value);
// 署名の作成・追加
parameter.Add("oauth_signature", CreateSignature(consumerSecret, tokenSecret, httpMethod, requestUri, parameter));
// HTTPリクエストのヘッダに追加
- StringBuilder sb = new StringBuilder("OAuth ");
+ var sb = new StringBuilder("OAuth ");
if (realm != null)
sb.AppendFormat("realm=\"{0}\",", realm);
- foreach (KeyValuePair<string, string> item in parameter)
+ foreach (var (key, value) in parameter)
// 各種情報のうち、oauth_で始まる情報のみ、ヘッダに追加する。各情報はカンマ区切り、データはダブルクォーテーションで括る
- if (item.Key.StartsWith("oauth_"))
- sb.AppendFormat("{0}=\"{1}\",", item.Key, MyCommon.UrlEncode(item.Value));
+ if (key.StartsWith("oauth_", StringComparison.Ordinal))
+ sb.AppendFormat("{0}=\"{1}\",", key, MyCommon.UrlEncode(value));
return sb.ToString();
}
/// <returns>OAuth情報のディクショナリ</returns>
public static Dictionary<string, string> GetOAuthParameter(string consumerKey, string token)
{
- Dictionary<string, string> parameter = new Dictionary<string, string>();
- parameter.Add("oauth_consumer_key", consumerKey);
- parameter.Add("oauth_signature_method", "HMAC-SHA1");
- parameter.Add("oauth_timestamp", Convert.ToInt64((DateTime.UtcNow - UnixEpoch).TotalSeconds).ToString()); // epoch秒
- parameter.Add("oauth_nonce", NonceRandom.Next(123400, 9999999).ToString());
- parameter.Add("oauth_version", "1.0");
+ var parameter = new Dictionary<string, string>
+ {
+ ["oauth_consumer_key"] = consumerKey,
+ ["oauth_signature_method"] = "HMAC-SHA1",
+ ["oauth_timestamp"] = DateTimeUtc.Now.ToUnixTime().ToString(), // epoch秒
+ ["oauth_nonce"] = NonceRandom.Next(123400, 9999999).ToString(),
+ ["oauth_version"] = "1.0",
+ };
if (!string.IsNullOrEmpty(token))
parameter.Add("oauth_token", token); // トークンがあれば追加
return parameter;
public static string CreateSignature(string consumerSecret, string tokenSecret, string method, Uri uri, Dictionary<string, string> parameter)
{
// パラメタをソート済みディクショナリに詰替(OAuthの仕様)
- SortedDictionary<string, string> sorted = new SortedDictionary<string, string>(parameter);
+ var sorted = new SortedDictionary<string, string>(parameter);
// URLエンコード済みのクエリ形式文字列に変換
- string paramString = MyCommon.BuildQueryString(sorted);
+ var paramString = MyCommon.BuildQueryString(sorted);
// アクセス先URLの整形
- string url = string.Format("{0}://{1}{2}", uri.Scheme, uri.Host, uri.AbsolutePath);
+ var url = string.Format("{0}://{1}{2}", uri.Scheme, uri.Host, uri.AbsolutePath);
// 署名のベース文字列生成(&区切り)。クエリ形式文字列は再エンコードする
- string signatureBase = string.Format("{0}&{1}&{2}", method, MyCommon.UrlEncode(url), MyCommon.UrlEncode(paramString));
+ var signatureBase = string.Format("{0}&{1}&{2}", method, MyCommon.UrlEncode(url), MyCommon.UrlEncode(paramString));
// 署名鍵の文字列をコンシューマー秘密鍵とアクセストークン秘密鍵から生成(&区切り。アクセストークン秘密鍵なくても&残すこと)
- string key = MyCommon.UrlEncode(consumerSecret) + "&";
+ var key = MyCommon.UrlEncode(consumerSecret) + "&";
if (!string.IsNullOrEmpty(tokenSecret))
key += MyCommon.UrlEncode(tokenSecret);
// 鍵生成&署名生成
- using (HMACSHA1 hmac = new HMACSHA1(Encoding.ASCII.GetBytes(key)))
+ using (var hmac = new HMACSHA1(Encoding.ASCII.GetBytes(key)))
{
- byte[] hash = hmac.ComputeHash(Encoding.ASCII.GetBytes(signatureBase));
+ var hash = hmac.ComputeHash(Encoding.ASCII.GetBytes(signatureBase));
return Convert.ToBase64String(hash);
}
}