OAuthGetRequestToken: ошибка signature_invalid - PullRequest
1 голос
/ 15 апреля 2011

Я пытаюсь использовать API данных Google и столкнулся с трудностями в OAuthGetRequestToken.Я следую инструкции: requestToken

Я использую GET и добавляю параметры запроса после URL.

Я создаю базовую строку для подписи следующим образом: GET & request url & параметры запроса(без oauth_signature) в алфавитном порядке

Поскольку я использую HMAC-SHA1, для создания подписи я использую значение «секрета потребителя».

Наконец, я использую параметры запроса url + ибраузер всегда возвращает: signature_invalid base_string: GET & https% 3A% 2 101

, и я обнаружил, что base_string такая же, как в моем коде.

Не знаюзнать, в чем проблема и обратиться за помощью.Ниже приведен мой код: (hmac_sha1 правильно, так как я использую образцы данных из Oauth для тестирования)

#import "ContactTestViewController.h"
#import "ASIHTTPRequest.h"
#import <CommonCrypto/CommonHMAC.h>
#import <CommonCrypto/CommonCryptor.h>
#import "Base64.h"
#import "NSStringAdditions.h"
#import "NSData+Base64.h"
#define kAllContacts @"https://www.google.com/m8/feeds/contacts/default/full"

#define kOauthGetRequestToken @"https://www.google.com/accounts/OAuthGetRequestToken"

#define kOauthConsumerKey   @"oauth_consumer_key=***.net"
#define kOauthConsumerSecret        @"****/*****"
#define kOauthNonce @"oauth_nonce=457261624861626265724761686176"
#define kOauthSigMethod             @"oauth_signature_method=HMAC-SHA1"
#define kOauthSignature             @"oauth_signature="
#define kOauthTimeStamp             @"oauth_timestamp="
#define kOauthScope @"scope=https://www.google.com/m8/feeds/contacts/default/full"
#define kOauthCallback              @"oauth_callback=http://****.net/index.html"
#define kOauthVersion               @"oauth_version=1.0"
#define kXOauthDisplayname          @""

@implementation ContactTestViewController

- (NSString *)parameterStrNoSignature
{
NSDate *currentDate = [NSDate date];
NSTimeInterval timeInter = [currentDate timeIntervalSince1970];

NSString *str = [NSString stringWithFormat:@"%@&%@&%@&%@&%@%d&%@",
                 kOauthCallback,
                 kOauthConsumerKey,
                 kOauthNonce,
                 kOauthSigMethod,
                 kOauthTimeStamp,
                 (int)timeInter,
                 kOauthScope
                 ];

return str;
}

- (NSString *)hostEncode:(NSString *)str
{
NSString *str1 = [str stringByReplacingOccurrencesOfString:@":" withString:@"%3A"];
NSString *str2 = [str1 stringByReplacingOccurrencesOfString:@"/" withString:@"%2F"];

return str2;
}

- (NSString *)parameterEncode:(NSString *)str
{
NSString *str1 = [str  stringByReplacingOccurrencesOfString:@"/" withString:@"%252F"];
NSString *str2 = [str1 stringByReplacingOccurrencesOfString:@":" withString:@"%253A"];
NSString *str3 = [str2 stringByReplacingOccurrencesOfString:@"&" withString:@"%26"];
NSString *str4 = [str3 stringByReplacingOccurrencesOfString:@"=" withString:@"%3D"];
return str4;
}
- (NSString *)hmac_sha1:(NSString *)key text:(NSString*)plainText
{

const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [plainText cStringUsingEncoding:NSASCIIStringEncoding];

char cHMAC[CC_SHA1_DIGEST_LENGTH];

CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:CC_SHA1_DIGEST_LENGTH];
NSString *hash = [Base64 encode:HMAC];//base64 

hash = [HMAC base64EncodedString];
[HMAC release];
return hash;
}

- (void)authTest
{
NSString *parameterNoSignature = [self parameterStrNoSignature];
NSLog(@"no signature parameters:\n%@",parameterNoSignature);
NSString *baseStringEncode = [NSString stringWithFormat: @"GET&%@&%@",
                              [self      hostEncode:kOauthGetRequestToken],
                              [self parameterEncode:parameterNoSignature]
                              ];

NSLog(@"base string encode:\n%@",baseStringEncode);

NSString *signatureStr = [self hmac_sha1:kOauthConsumerSecret 
                                    text:baseStringEncode];
NSLog(@"signature:\n%@",signatureStr);



NSString *urlStr = [NSString stringWithFormat:@"%@?%@&%@%@",
                    kOauthGetRequestToken,
                    parameterNoSignature,
                    kOauthSignature,
                    signatureStr
                ];
NSLog(@"url string:\n%@",urlStr);
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
 [super viewDidLoad];

[self authTest];
}

- (void)dealloc {
[super dealloc];
}

1 Ответ

1 голос
/ 17 апреля 2011

Для ключа вам нужно [в псевдокоде]: urlencode (utf8 (oauth_consumer_secret)) + "&" + urlencode (utf8 (oauth_token_secret)) *

Недостаточно просто использовать oauth_consumer_secret. Если oauth_token_secret пусто, как это будет в начале процесса OAuth, эта часть будет пуста , но вам все еще нужен & следующий за закодированным секретом пользователя .

...