OAuthGetRequestToken:signature_invalid错误
|
我尝试使用Google数据API,并在OAuthGetRequestToken遇到困难。
我遵循指令:requestToken
我使用GET并在URL后添加查询参数。
我以这种方式创建用于签名的基本字符串:
GET&request url&query参数(不带oauth_signature)按字母顺序排序
当我使用HMAC-SHA1时,我使用“消费者秘密”值来创建签名。
最后,我使用url + query参数,浏览器始终返回:
signature_invalid
base_string:GET&https%3A%2 ******
我发现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 个回复
冕偷淮款