2015-06-08 2 views
5

Вопрос
Здравствуйте, мне нужно для проверки подлинности на API которым необходимо шифрование OAuth.
Я в правильном направлении, но я уверен, что что-то не так с моей базовой базой. Поскольку HMACSHA1 Hash основан на Key и BaseString, я получаю неправильную oauth_signature.
OAuth Signing ProcessСоздать OAuth Signature с HMAC-SHA1 Шифрование возвращает HTTP 401

До сих пор
я был в состоянии собрать все необходимые части данных, которая включает в себя:

  • ключ потребителя
  • Consumer Secret
  • маркер доступа
  • Acces Secret
  • Sha1Hased Value (на основе ключа и сообщение, в котором сообщение является подпись Базовая строка)
  • Подпись Base Строка

Проблема
Я получаю HTTP (401 Bad Request) вернулся из-за недопустимая подпись.
примечание: Я уверен, что это как я строю свою Подпись Базовая строка. Для получения информации о Документах API, которые я использовал, проверьте нижнюю страницу.

Кодекс

GetOAuthToken (Doing фактический запрос)

public static string GetAuthorizationToken() 
{ 
    string TimeInSecondsSince1970 = ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString(); 
    string Nonce = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(TimeInSecondsSince1970 
    + TimeInSecondsSince1970 + TimeInSecondsSince1970)); 
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(GetAppleApiUrl.GetUrl(AppleApiUrl.SESSION_TOKEN)); 
    httpWebRequest.Method = "GET"; 

    string consumer_secret = Uri.EscapeDataString(Settings.SettingsManager.consumer_secret); 
    string token_secret = Uri.EscapeDataString(Settings.SettingsManager.access_secret); 

    string signature_base_string = GetSignatureBaseString(TimeInSecondsSince1970, Nonce); 
    string SHA1HASH = GetSha1Hash(consumer_secret + "&" + token_secret, signature_base_string); 

    string Header = 
     "OAuth realm=" + '"' + "ADM" + '"' + "," + 
     "oauth_consumer_key=" + '"' + Settings.SettingsManager.consumer_key + '"' + "," + 
     "oauth_token=" + '"' + Settings.SettingsManager.access_token + '"' + "," + 
     "oauth_signature_method=" + '"' + "HMAC-SHA1" + '"' + "," + 
     "oauth_signature= " + '"' + SHA1HASH + '"' + "," + 
     "oauth_timestamp=" + '"' + TimeInSecondsSince1970 + '"' + "," + 
     "oauth_nonce=" + '"' + Nonce + '"' + "," + 
     "oauth_version=" + '"' + "1.0" + '"' + ","; 

    httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, Header); 
    var Result = httpWebRequest.GetResponse(); 

    return Result.ToString(); 
} 

GetSha1Hash

public static string GetSha1Hash(string key, string message) 
{ 
    var encoding = new System.Text.ASCIIEncoding(); 

    byte[] keyBytes = encoding.GetBytes(key); 
    byte[] messageBytes = encoding.GetBytes(message); 

    string Sha1Result = string.Empty; 

    using (HMACSHA1 SHA1 = new HMACSHA1(keyBytes)) 
    { 
     var Hashed = SHA1.ComputeHash(messageBytes); 
     Sha1Result = Convert.ToBase64String(Hashed); 
    } 

    return Sha1Result; 
} 

GetSignatureBaseString

public static string GetSignatureBaseString(string TimeStamp, string Nonce) 
{ 
    //1.Convert the HTTP Method to uppercase and set the output string equal to this value. 
    string Signature_Base_String = "Get"; 
    Signature_Base_String = Signature_Base_String.ToUpper(); 

    //2.Append the ‘&’ character to the output string. 
    Signature_Base_String = Signature_Base_String + "&"; 

    //3.Percent encode the URL and append it to the output string. 
    string PercentEncodedURL = Uri.EscapeDataString(GetAppleApiUrl.GetUrl(AppleApiUrl.SESSION_TOKEN)); 
    Signature_Base_String = Signature_Base_String + PercentEncodedURL; 

    //4.Append the ‘&’ character to the output string. 
    Signature_Base_String = Signature_Base_String + "&"; 

    //5.append parameter string to the output string. 
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("oauth_consumer_key=" + Settings.SettingsManager.consumer_key); 
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_token=" + Settings.SettingsManager.access_token); 
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_signature_method=" +"HMAC-SHA1"); 
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_timestamp=" + TimeStamp); 
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_nonce=" + Nonce); 
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_version=" + "1.0"); 

    return Signature_Base_String; 
} 

Результат (Скрипач) Fiddler Result
API Doc enter image description here

+0

Попробуйте использовать этот https://msdn.microsoft.com/en-us/library/system.security .cryptography.hmacsha1 (v = vs.110) .aspx? cs-save-lang = 1 & cs-lang = csharp # code-snippet-1 для подписания – daehaai

+0

@PreyashDesai - тот же ответ (400). Создал другой хэш, хотя .. Почему я должен использовать HMACSHA1 над SHA1Managed? –

+1

см. Http://blog.aggregatedintelligence.com/2007/10/fips-validated-cryptographic-algorithms.html SHA1Managed не соответствует FIPS, а HMACSHA1 -. Но его не исправить вашу проблему. – daehaai

ответ

3

Похоже, вы должны сортировать параметры в алфавитном порядке в Header строке и в GetSignatureBaseString способом, как описано в this comment и Twitter OAuth documentation

+0

Я могу наградить его за 22 часа. –

Смежные вопросы