尝试进行"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上附加双引号'“'。
如果还有键/值对,请在夏令时附加逗号','和空格'。
在构建此字符串时要特别注意值的百分比编码。例如,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签名和令牌