2013-08-16 4 views
0

Вот заголовок авторизации я использую:401 ответ Twitter обратного Auth

Authorization = "OAuth oauth_consumer_key=\"2D9rLD8Lu23hrchrh4VMBkQ6AZKHYi2yY2oeuoeutcFMdAs\", oauth_nonce=\"-486353546\", oauth_signature="x3NdGnJmBTUAICBRE9C44N8mFd4%3D", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"137663828056\", oauth_version=\"1.0\", x_auth_mode=\"reverse_auth\""; 

Вот базовая строка я использую:

https://api.twitter.com/oauth/access_token 

Вот twitter documentation я работаю с:

Шаг 1: Получить специальный токен

Во-первых, вы делаете запрос HTTPS к URL-адресу токена запроса Twitter https://api.twitter.com/oauth/request_token с ключом вашего приложения . В дополнение к обычным параметрам oauth_ * подписи , вы также должны включить x_auth_mode в значение reverse_auth.

В качестве примера рассмотрим запрос со следующими значениями подписал с токена, ydC2yUbFaScbSlykO0PmrMjXFeLraSi3Q2HfTOlGxQM:

Маркеры, используемые здесь только для демонстрационных целей и не будет работа для вас.

oauth_consumer_key JP3PyvG67rXRsnayOJOcQ oauth_nonce 1B7D865D-9E15-4ADD-8165-EF90D7A7D3D2 oauth_signature_method HMAC-SHA1 oauth_timestamp 1322697052 oauth_version 1,0 x_auth_mode reverse_auth Эти параметры должны привести к подписи базовой строки, которая выглядит так:

POST & HTTPS% 3A% 2F% 2Fapi.twitter.com% 2Foauth% 2Frequest_token & oauth_consumer_key% 3DJP3PyvG67rXRsnayOJOcQ% 26oauth_nonce% 3D1B7D865D-9E15-4ADD-8165-EF90D7A7D3D2% 26oauth_signature_method% 3DHMAC-SHA1% 26oauth_timestamp% 3D1322697052% 26oauth_version% 3D1.0% 26x_auth_mode% 3Dreverse_auth Этот вызов должен дать ответ, который выглядит следующим образом. Отметьте , что этот ответ на самом деле выглядит как заголовок OAuth.

(перенос строк добавлена ​​для ясности):

OAuth oauth_nonce = "xq2maKtilFhVTC1MSxVC4cQIJLd53O6w97YmrdOGSk8", oauth_signature_method = "HMAC-SHA1", oauth_timestamp = "1322697052", oauth_consumer_key = "JP3PyvG67rXRsnayOJOcQ", oauth_token = "5mgkU82W0PTA0DLgSIA5vFK6c08i8dXzrbLnX06vl38 », oauth_signature = "AOm% 2FwW2kAowAeHBRvw7faH245p0% 3D", oauth_version = "1,0"

Edit: Я зачёте Я получаю 401. Я использовал следующий код для создания oauth_signature, так что теперь мой заголовок Authorization выглядит следующим образом: OAuth oauth_timestamp="1376639141", oauth_nonce="BB2D2634F3-99A5-4B64-8CB34E-2314CE9E4FD7", oauth_version="1.0", oauth_consumer_key="mrcD8LuSNKJKFAchKHYi2yY2qwh5tcFMdAs", oauth_signature_method="HMAC-SHA1", oauth_signature="moer8H7xzluAdoAAAFZpv6n4noeu%3D"

NSString *OAuthorizationHeader(NSURL *url, NSString *method, NSData *body, NSString *_oAuthConsumerKey, NSString *_oAuthConsumerSecret, NSString *_oAuthToken, NSString *_oAuthTokenSecret) 
{ 
    NSString *_oAuthNonce = [NSString ab_GUID]; 
    NSString *_oAuthTimestamp = [NSString stringWithFormat:@"%d", (int)[[NSDate date] timeIntervalSince1970]]; 
    NSString *_oAuthSignatureMethod = @"HMAC-SHA1"; 
    NSString *_oAuthVersion = @"1.0"; 

    NSMutableDictionary *oAuthAuthorizationParameters = [NSMutableDictionary dictionary]; 
    oAuthAuthorizationParameters[@"oauth_nonce"] = _oAuthNonce; 
    oAuthAuthorizationParameters[@"oauth_timestamp"] = _oAuthTimestamp; 
    oAuthAuthorizationParameters[@"oauth_signature_method"] = _oAuthSignatureMethod; 
    oAuthAuthorizationParameters[@"oauth_version"] = _oAuthVersion; 
    oAuthAuthorizationParameters[@"oauth_consumer_key"] = _oAuthConsumerKey; 
    if(_oAuthToken) 
     oAuthAuthorizationParameters[@"oauth_token"] = _oAuthToken; 

    // get query and body parameters 
    NSDictionary *additionalQueryParameters = [NSURL ab_parseURLQueryString:[url query]]; 
    NSDictionary *additionalBodyParameters = nil; 
    if(body) { 
     NSString *string = [[[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding] autorelease]; 
     if(string) { 
      additionalBodyParameters = [NSURL ab_parseURLQueryString:string]; 
     } 
    } 

    // combine all parameters 
    NSMutableDictionary *parameters = [[oAuthAuthorizationParameters mutableCopy] autorelease]; 
    if(additionalQueryParameters) [parameters addEntriesFromDictionary:additionalQueryParameters]; 
    if(additionalBodyParameters) [parameters addEntriesFromDictionary:additionalBodyParameters]; 

    // -> UTF-8 -> RFC3986 
    NSMutableDictionary *encodedParameters = [NSMutableDictionary dictionary]; 
    for(NSString *key in parameters) { 
     NSString *value = parameters[key]; 
     encodedParameters[[key ab_RFC3986EncodedString]] = [value ab_RFC3986EncodedString]; 
    } 

    NSArray *sortedKeys = [[encodedParameters allKeys] sortedArrayUsingFunction:SortParameter context:encodedParameters]; 

    NSMutableArray *parameterArray = [NSMutableArray array]; 
    for(NSString *key in sortedKeys) { 
     [parameterArray addObject:[NSString stringWithFormat:@"%@=%@", key, encodedParameters[key]]]; 
    } 
    NSString *normalizedParameterString = [parameterArray componentsJoinedByString:@"&"]; 

    NSString *normalizedURLString = [NSString stringWithFormat:@"%@://%@%@", [url scheme], [url host], [url path]]; 

    NSString *signatureBaseString = [NSString stringWithFormat:@"%@&%@&%@", 
            [method ab_RFC3986EncodedString], 
            [normalizedURLString ab_RFC3986EncodedString], 
            [normalizedParameterString ab_RFC3986EncodedString]]; 

    NSString *key = [NSString stringWithFormat:@"%@&%@", 
        [_oAuthConsumerSecret ab_RFC3986EncodedString], 
        (_oAuthTokenSecret) ? [_oAuthTokenSecret ab_RFC3986EncodedString] : @""]; 

    NSData *signature = HMAC_SHA1(signatureBaseString, key); 
    NSString *base64Signature = [signature base64EncodedString]; 

    NSMutableDictionary *authorizationHeaderDictionary = [[oAuthAuthorizationParameters mutableCopy] autorelease]; 
    authorizationHeaderDictionary[@"oauth_signature"] = base64Signature; 

    NSMutableArray *authorizationHeaderItems = [NSMutableArray array]; 
    for(NSString *key in authorizationHeaderDictionary) { 
     NSString *value = authorizationHeaderDictionary[key]; 
     [authorizationHeaderItems addObject:[NSString stringWithFormat:@"%@=\"%@\"", 
              [key ab_RFC3986EncodedString], 
              [value ab_RFC3986EncodedString]]]; 
    } 

    NSString *authorizationHeaderString = [authorizationHeaderItems componentsJoinedByString:@", "]; 

    authorizationHeaderString = [NSString stringWithFormat:@"OAuth %@", authorizationHeaderString]; 

    return authorizationHeaderString; 
} 

Параметры, я прохожу в этому методу являются url: https://api.twitter.com/oauth/request_token, method: POST, body: ноль, oAuthConsumerToken : мой ключ, oAuthConsumerSecret: мой секрет, oAuthToken: ноль, oAuthTokenSecret: ноль.

EDIT Я попробовал этот oauth test console, чтобы убедиться, что я правильно генерирование OAuth подписи, но, похоже, мне нужно токены и секретная Участника:

enter image description here

ответ

0

Вы не включили oauth_signature в заголовке авторизации.

+0

Похоже, что я не нуждаюсь в 'oauth_signature' в заголовке авторизации. Похоже, что это должно быть частью ответа. –

+0

В документации указано, что вы должны быть «знакомы с процессом подписания, прежде чем пытаться использовать конечную точку», которая предполагает, что ваш первоначальный запрос все еще нуждается в подписании. Также почему вы создаете базовую строку подписи, если вы не собираетесь подписывать запрос? –

+0

Спасибо, я добавил его, и я все еще получаю 401. Я пишу, как я создал подпись в конце моего вопроса. –

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