OAuthGetRequestToken:signature_invalid错误

我尝试使用谷歌数据API,并遇到困难在OAuthGetRequestToken。 我遵循指令: requestToken

我使用GET并在URL之后添加查询参数。

我以这种方式为签名创build基本string:按字母顺序sorting的GET&request url&query参数(不带oauth_signature)

在我使用HMAC-SHA1时,我使用“消费者机密”值来创build签名。

最后,我使用url +查询参数,浏览器总是返回:signature_invalid base_string:GET&https%3A%2 ******

我发现base_string与我的代码中的一样。

我不知道问题在哪里,请求帮助。 下面是我的代码:(hmac_sha1是正确的,因为我使用Oauth的样本数据来testing)

#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]; } 

对于密钥,你需要[in pseudocode]:urlencode(utf8(oauth_consumer_secret))+“&”+ urlencode(utf8(oauth_token_secret))

只是使用oauth_consumer_secret是不够的。 如果oauth_token_secret是空的,因为它将在OAuth进程的开始处,该部分将是空的, 但是您仍然需要&编码消费者密码