【问题标题】:Twitter Request Token (Failed to validate oauth signature and token)Twitter 请求令牌(验证 oauth 签名和令牌失败)
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • Yar,你能通过 swift 发布代码吗?我在这里敲了 3 多天。:\
    猜你喜欢
    • 2013-10-22
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2017-06-23
    相关资源
    最近更新 更多