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];
}
    
已邀请:
对于密钥,您需要[使用伪代码]:urlencode(utf8(oauth_consumer_secret))+ \“&\” + urlencode(utf8(oauth_token_secret)) 仅使用oauth_consumer_secret是不够的。如果oauth_token_secret为空(如在OAuth流程开始时一样),则该部分将为空,但是您仍然需要&紧跟已编码的使用者密码。     

要回复问题请先登录注册