2016-05-19 11 views
0

OAuth 1.0を使用するAPIを使用しています。 APIのウェブサイトには、標準的な方法を使用する以外のドキュメントはありません。私はここのtwitterサイトのガイドに従いましたhttps://dev.twitter.com/oauth/overview/creating-signaturesOAuth 1.0 APIで無効な署名

すべてが私にとっては良いようですが、私には無効な署名があるというメッセージが表示され続けます。私はgithubで見つけたクラスで始めました。署名のエラーが出ていました。クラスは大変複雑でしたので、私は自分のシンプルなクラス(C#を使用しています)を作成しました。ここで使用されているすべての値を正しく設定するコンストラクタがあります。私は100%確かに欠けているデータはない、問題は署名/要求がどのように生成されているかでなければならないが、私が見る限り、すべてが正しくセットアップされている。出力ヘッダーが正しく表示され、すべてが読み込まれます。どんなアイデアが間違っている?

public string GenerateHeaderString(string url, string method) 
{ 
    string auth = "OAuth oauth_consumer_key=\"" + ConsumerKey + "\",oauth_token=\"" + HttpUtility.UrlEncode(Token) + "\",oauth_signature_method=\"" + SignatureMethod 
     + "\",oauth_timestamp=\"" + Timestamp + "\",oauth_nonce=\"" + Nonce + "\",oauth_version=\"" + Version + "\",oauth_signature=\"" + GenerateSignature(url, method) + "\""; 
    return auth;    
} 

public string GenerateSignature(string url, string method) 
{ 
    string signature = method + "&" + HttpUtility.UrlEncode(url) + "&" + HttpUtility.UrlEncode("oauth_consumer_key=" + ConsumerKey 
     + "&oauth_nonce=" + Nonce + "&oauth_signature_method=" + SignatureMethod + "&oauth_timestamp=" 
     + Timestamp + "&oauth_token=" + Token + "&oauth_version=" + Version); 
    switch(SignatureMethod) 
    { 
     case "HMAC-SHA1": 
      string keystring = string.Format("{0}&{1}", HttpUtility.UrlEncode(this.ConsumerSecret),HttpUtility.UrlEncode(this.TokenSecret)); 

      var hmacsha1 = new HMACSHA1 
      { 
       Key = System.Text.Encoding.ASCII.GetBytes(keystring) 
      }; 
      byte[] dataBuffer = System.Text.Encoding.ASCII.GetBytes(signature); 
      byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer); 

      this.Signature = HttpUtility.UrlEncode(Convert.ToBase64String(hashBytes)); 
     break; 
    } 
    return this.Signature; 
} 

答えて

0

私は、ハッシュする前に署名をURLエンコードする必要があると考えています。最初の2つのアンパサンドはエンコードされませんが、その他はすべてエンコードされます。ここで私が使用するいくつかのコードです。私が持っている唯一の問題は、クエリ文字列に値のスペースが含まれている場合です。

 var signatureType = string.Empty; 

     switch (((OAuth1)webRequestDetails.Authentication).SignatureMethod) 
     { 
      case SignatureMethod.HMACSHA1: 
      { 
       signatureType = "HMAC-SHA1"; 
       break; 
       } 
      case SignatureMethod.HMACSHA256: 
       { 
        signatureType = "HMAC-SHA256"; 
        break; 
       } 
      case SignatureMethod.PLAINTEXT: 
       { 
        signatureType = "PLAINTEXT"; 
        break; 
       } 
     } 

     var baseUrl = webRequestDetails.Url; 
     var queryStrings = new List<string>(); 

     var queryStartIndex = baseUrl.IndexOf("?", StringComparison.Ordinal); 
     if (queryStartIndex != -1) 
     { 
      queryStrings = baseUrl.Substring(queryStartIndex + 1, baseUrl.Length - queryStartIndex - 1).Split('&').ToList(); 
      baseUrl = baseUrl.Substring(0, queryStartIndex); 
     } 

     //string builder will be used to append all the key value pairs 
     var stringBuilder = new StringBuilder(); 
     stringBuilder.Append(httpMethod.Method.ToUpper() + "&"); 
     stringBuilder.Append(Uri.EscapeDataString(baseUrl)); 
     stringBuilder.Append("&"); 

     //the key value pairs have to be sorted by encoded key 
     var dictionary = new SortedDictionary<string, string> 
     { 
      {"oauth_version", "1.0"}, 
      {"oauth_consumer_key", ((OAuth1) webRequestDetails.Authentication).ConsumerKey}, 
      {"oauth_nonce", ((OAuth1) webRequestDetails.Authentication).Nonce}, 
      {"oauth_signature_method", signatureType}, 
      {"oauth_timestamp", ((OAuth1) webRequestDetails.Authentication).TimeStamp}, 
      {"oauth_token", ((OAuth1) webRequestDetails.Authentication).Token} 
     }; 

     //merge in the querystrings 
     foreach (var queryString in queryStrings) 
     { 
      var queryStringParts = queryString.Split('='); 
      dictionary.Add(queryStringParts[0], queryStringParts[1]); 
     } 

     foreach (var keyValuePair in dictionary) 
     { 
      //append a = between the key and the value and a & after the value 
      stringBuilder.Append(Uri.EscapeDataString($"{keyValuePair.Key}={keyValuePair.Value}&")); 
     } 

     var signatureBaseString = stringBuilder.ToString().Substring(0, stringBuilder.Length - 3); 

     //generation the signature key the hash will use 
     var signatureKey = 
      Uri.EscapeDataString(((OAuth1) webRequestDetails.Authentication).ConsumerSecret) + "&" + 
      Uri.EscapeDataString(((OAuth1) webRequestDetails.Authentication).TokenSecret); 

     var hmacsha1 = new HMACSHA1(
      new ASCIIEncoding().GetBytes(signatureKey)); 

     //hash the values 
     var signatureString = Convert.ToBase64String(
      hmacsha1.ComputeHash(
       new ASCIIEncoding().GetBytes(signatureBaseString))); 

     return signatureString;