HMAC-SHA1 для iOS в соответствии с вызовом Yahoo OAuth API

Я знаю, что функции HMAC-SHA1 легко доступны на SO, но я пробовал все из них для создания подписи OAuth, но безуспешно.

Поскольку пример кода, предоставленный yahoo, написан на Java, я не уверен, слежу ли я за тем же HMAC -SHA1 алгоритм.

Вот метод, который я использую для его создания:

- (NSString *)generateOAuthHeader
{
    NSString *apiURL = @"https://weather-ydn-yql.media.yahoo.com/forecastrss";
    NSString *oauth_consumer_key = @"dj0yJmk9V004dENIbkd6dXh3JnM9Y29uc3VtZXJzZWNyZXQmc3Y9MCZ4PTg0";
    NSString *consumerSecret = @"9b54fad8d2bccedaa17eddfe342a0178ee72eb34";
    NSString *oauth_nonce = @"840eee23-f521-4d52-bca9-3a715894f22";
    NSString *oauth_signature_method = @"HMAC-SHA1";
    NSString *oauth_timestamp = [NSString stringWithFormat:@"%.0f", [[NSDate date] timeIntervalSince1970]];
    NSString *oauth_version = @"1.0";

    NSString *encodedApiURL = urlformdata_encode(apiURL);

    NSString *parameters = NSString *parameters = [NSString stringWithFormat:@"oauth_consumer_key=%@&oauth_nonce=%@&oauth_signature_method=%@&oauth_timestamp=%@&oauth_version=%@&lat=%f&lon=%f&format=json", oauth_consumer_key, oauth_nonce, oauth_signature_method, oauth_timestamp, oauth_version, 30.707640, 76.703553, nil];
    NSString *encodedParameters = urlformdata_encode(parameters);

    NSString *signature = [NSString stringWithFormat:@"GET&%@&%@&", encodedApiURL, encodedParameters];
    signature = [self hmacsha1:signature secret:consumerSecret];

NSString *authorizationHeader = [NSString stringWithFormat:@"OAuth oauth_consumer_key=\"%@\", oauth_nonce=\"%@\", oauth_signature_method=\"%@\", oauth_timestamp=\"%@\", oauth_version=\"%@\", oauth_signature=\"%@\"", oauth_consumer_key, oauth_nonce, oauth_signature_method, oauth_timestamp, oauth_version, signature,  nil];

return authorizationHeader;
}

Но я всегда получаю ошибку 401, что означает неправильную подпись.

Я создал общедоступное репо в objective-c, чтобы любой мог попробовать его, оно доступно здесь: https://github.com/userException/yahooOAuthiOS


person nr5    schedule 19.01.2019    source источник


Ответы (1)


Одна деталь, которая не упоминается на странице Yahoo, заключается в том, что вы должны добавить «&» к секрету потребителя при создании зашифрованной строки HMA-SHA1. Из-за этого строка HMAC-SHA1 не была тем, с чем ее сравнивал сервер Yahoo.

Я зафиксировал свои изменения в том же репо, упомянутом в вопросе, если вам нужна его версия Swift / Objective-C.

person nr5    schedule 27.01.2019