【发布时间】:2014-10-08 22:02:00
【问题描述】:
尝试进行"reverse auth" 调用以获取服务器的访问令牌。我正在完全遵循 Twitter 的文档(至少我认为我是这样),但我不能为了我的生活,让它发挥作用。可能缺少什么。
编辑:我创建了 github gist 以便于复制和粘贴。 https://gist.github.com/YarGnawh/10a4ee306578d9aceb28
NSString * http_method = @"POST";
NSString * request_url = @"https://api.twitter.com/oauth/request_token";
NSString * oauth_consumer_key = @"xxxxxxxxxxxxxxxxxxxx";
NSString * oauth_consumer_secret = @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
NSString * oauth_nonce = [[NSUUID UUID] UUIDString];
NSString * oauth_signature = @"";
NSString * oauth_signature_method = @"HMAC-SHA1";
NSString * oauth_timestamp = [NSString stringWithFormat:@"%.0f", [[NSDate date] timeIntervalSince1970]];
- 对每个将被签名的键和值进行百分比编码。
- 通过编码键[2]按字母顺序[1]对参数列表进行排序。
- 对于每个键/值对:
- 将编码的密钥附加到输出字符串。
- 将“=”字符附加到输出字符串。
- 将编码值附加到输出字符串。
- 如果还有更多的键/值对,则在输出字符串中附加一个“&”字符。
NSMutableString *parameter_string = [NSMutableString string];
[parameter_string appendFormat:@"oauth_consumer_key=%@&", oauth_consumer_key];
[parameter_string appendFormat:@"oauth_nonce=%@&", oauth_nonce];
[parameter_string appendFormat:@"oauth_signature_method=%@&", oauth_signature_method];
[parameter_string appendFormat:@"oauth_timestamp=%@&", oauth_timestamp];
[parameter_string appendFormat:@"oauth_version=%@&", oauth_version];
[parameter_string appendFormat:@"x_auth_mode=%@", x_auth_mode];
NSLog(@"parameter_string = %@", parameter_string);
- 将 HTTP 方法转换为大写,并将输出字符串设置为该值。
- 将“&”字符附加到输出字符串。
- 百分比编码 URL 并将其附加到输出字符串。
- 将“&”字符附加到输出字符串。
- 百分比编码参数字符串并将其附加到输出字符串。
NSMutableString * signature_base_string = [NSMutableString string];
[signature_base_string appendFormat:@"%@", http_method];
[signature_base_string appendString:@"&"];
[signature_base_string appendFormat:@"%@", [self percentEncodeString:request_url]];
[signature_base_string appendString:@"&"];
[signature_base_string appendFormat:@"%@", [self percentEncodeString:parameter_string]];
NSLog(@"signature_base_string = %@", signature_base_string);
Note that there are some flows, such as when obtaining a request token, where the token secret is not yet known. In this case, the signing key should consist of the percent encoded consumer secret followed by an ampersand character '&'.
NSString * signing_key = [NSString stringWithFormat:@"%@&", [self percentEncodeString:oauth_consumer_secret]];
const char *cKey = [signing_key cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [signature_base_string cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
oauth_signature = [[[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)] base64EncodedStringWithOptions:0];
NSLog(@"oauth_signature = %@", oauth_signature);
将字符串“OAuth”(包括末尾的空格)附加到 DST。
对于上面列出的 7 个参数的每个键/值对:
对密钥进行百分比编码并将其附加到 DST。
将等号字符“=”附加到 DST。
将双引号 '"' 附加到 DST。
百分比编码值并将其附加到 DST。
将双引号 '"' 附加到 DST。
如果还有键/值对,则在 DST 后附加一个逗号“,”和一个空格“”。
在构建此字符串时,请特别注意值的百分比编码。例如,tnnArxj06cWHq44gCs1OSKk/jLY= 的 oauth_signature 值必须编码为 tnnArxj06cWHq44gCs1OSKk%2FjLY%3D。
NSMutableString *header = [NSMutableString stringWithString:@"OAuth "];
[header appendFormat:@"oauth_consumer_key=\"%@\", ", oauth_consumer_key];
[header appendFormat:@"oauth_nonce=\"%@\", ", oauth_nonce];
[header appendFormat:@"oauth_signature=\"%@\", ", [self percentEncodeString:oauth_signature]];
[header appendFormat:@"oauth_signature_method=\"%@\", ", oauth_signature_method];
[header appendFormat:@"oauth_timestamp=\"%@\", ", oauth_timestamp];
[header appendFormat:@"oauth_version=\"%@\", ", oauth_version];
[header appendFormat:@"x_auth_mode=\"%@\"", x_auth_mode];
终于发出请求:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:request_url]];
[request setHTTPMethod:@"POST"];
[request setValue:header forHTTPHeaderField:@"Authorization"];
NSLog(@"%@", request);
[[[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}] resume];
我得到无法验证 oauth 签名和令牌
【问题讨论】:
标签: ios objective-c twitter oauth