Twitter请求令牌(无法验证oauth签名和令牌)

时间:2014-08-15 05:52:51

标签: ios objective-c twitter oauth

尝试进行"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签名和令牌

1 个答案:

答案 0 :(得分:0)

终于找到了答案。 Poor documentation by Twitter

x_auth_mode=reverse_auth需要在帖子正文中,而不是标题。