OAuthGetRequestToken: erreur signature_invalid

J'essaie d'utiliser google data api et rencontré des difficultés à OAuthGetRequestToken. Je suis l'instruction: requestToken

J'utilise GET et j'ajoute des parameters de requête après l'url.

Je crée la string de base pour la signature de cette façon: GET & request url & query parameters (sans oauth_signature) classés par ordre alphabétique

Comme j'utilise HMAC-SHA1, j'utilise la valeur "secret du consommateur" pour créer la signature.

Enfin, j'utilise les parameters de requête url +, et le browser returnne toujours: signature_invalid base_ssortingng: GET & https% 3A% 2 ******

et j'ai trouvé la base_ssortingng est la même que celle de mon code.

Je ne sais pas où est le problème et requestr de l'aide. Ci-dessous est mon code: (hmac_sha1 a raison car j'utilise des données d'échantillon d'Oauth pour tester)

#import "ContactTestViewController.h" #import "ASIHTTPRequest.h" #import <CommonCrypto/CommonHMAC.h> #import <CommonCrypto/CommonCryptor.h> #import "Base64.h" #import "NSSsortingngAdditions.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 - (NSSsortingng *)parameterStrNoSignature { NSDate *currentDate = [NSDate date]; NSTimeInterval timeInter = [currentDate timeIntervalSince1970]; NSSsortingng *str = [NSSsortingng ssortingngWithFormat:@"%@&%@&%@&%@&%@%d&%@", kOauthCallback, kOauthConsumerKey, kOauthNonce, kOauthSigMethod, kOauthTimeStamp, (int)timeInter, kOauthScope ]; return str; } - (NSSsortingng *)hostEncode:(NSSsortingng *)str { NSSsortingng *str1 = [str ssortingngByReplacingOccurrencesOfSsortingng:@":" withSsortingng:@"%3A"]; NSSsortingng *str2 = [str1 ssortingngByReplacingOccurrencesOfSsortingng:@"/" withSsortingng:@"%2F"]; return str2; } - (NSSsortingng *)parameterEncode:(NSSsortingng *)str { NSSsortingng *str1 = [str ssortingngByReplacingOccurrencesOfSsortingng:@"/" withSsortingng:@"%252F"]; NSSsortingng *str2 = [str1 ssortingngByReplacingOccurrencesOfSsortingng:@":" withSsortingng:@"%253A"]; NSSsortingng *str3 = [str2 ssortingngByReplacingOccurrencesOfSsortingng:@"&" withSsortingng:@"%26"]; NSSsortingng *str4 = [str3 ssortingngByReplacingOccurrencesOfSsortingng:@"=" withSsortingng:@"%3D"]; return str4; } - (NSSsortingng *)hmac_sha1:(NSSsortingng *)key text:(NSSsortingng*)plainText { const char *cKey = [key cSsortingngUsingEncoding:NSASCIISsortingngEncoding]; const char *cData = [plainText cSsortingngUsingEncoding:NSASCIISsortingngEncoding]; 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]; NSSsortingng *hash = [Base64 encode:HMAC];//base64 hash = [HMAC base64EncodedSsortingng]; [HMAC release]; return hash; } - (void)authTest { NSSsortingng *parameterNoSignature = [self parameterStrNoSignature]; NSLog(@"no signature parameters:\n%@",parameterNoSignature); NSSsortingng *baseSsortingngEncode = [NSSsortingng ssortingngWithFormat: @"GET&%@&%@", [self hostEncode:kOauthGetRequestToken], [self parameterEncode:parameterNoSignature] ]; NSLog(@"base ssortingng encode:\n%@",baseSsortingngEncode); NSSsortingng *signatureStr = [self hmac_sha1:kOauthConsumerSecret text:baseSsortingngEncode]; NSLog(@"signature:\n%@",signatureStr); NSSsortingng *urlStr = [NSSsortingng ssortingngWithFormat:@"%@?%@&%@%@", kOauthGetRequestToken, parameterNoSignature, kOauthSignature, signatureStr ]; NSLog(@"url ssortingng:\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]; } 

Pour la key, vous avez besoin de [en pseudo-code]: urlencode (utf8 (oauth_consumer_secret)) + "&" + urlencode (utf8 (oauth_token_secret))

L'utilisation du file oauth_consumer_secret est insuffisante. Si oauth_token_secret est vide, comme ce sera le cas au début du process OAuth, cette partie sera vide mais vous aurez toujours besoin du & & suivant le code du client encodé .