Twitter oauth / access_token 401错误

时间:2014-04-17 08:40:45

标签: ios authentication twitter sttwitter

我一直致力于使用完整OAuth应用流程的所有内容,而且我遇到了一个问题,我只回到401 ="无效或过期的令牌"错误。我已经用文档检查了我的请求,一切看起来都正确,而且我很难过。以下是我的要求的详细信息。

URL
https://api.twitter.com/1.1/oauth/access_token

HTTP Method
POST

Headers
Content-Type: application/x-www-form-urlencoded
Authorization: OAuth oauth_consumer_key="CONSUMER_API_KEY", oauth_nonce="B4D43B0C-A348-4EB6-9C0B-8B0F4FE8", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1397724299", oauth_version="1.0", oauth_token="TOKEN_FROM_REQUEST_TOKEN_API", oauth_signature="ulYIzTacwC%2FeGUdoCPYsrFEqg4A%3D"

HTTP Body
oauth_verifier=OAUTH_VERIFIER_FROM_REQUEST_TOKEN_API

我没有问题让oauth / request_token API工作,我已经在Twitter的应用程序设置中正确设置了权限。有没有人知道这是怎么回事?

感谢您提供的所有帮助。

- 更新 -

另一件需要注意的事情是我使用STTwitter库来发出请求。它没有内置的方法来处理oauth / authorize或oath / authenticate API方法,所以我使用下面的代码。

// get request token, and present login screen
STTwitterAPI *twitter = [STTwitterAPI twitterAPIWithOAuthConsumerKey:twitterApiKey consumerSecret:twitterApiSecret];
[twitter postTokenRequest:^(NSURL *url, NSString *oauthToken)
{
    authWebViewController = [[TWAuthWebViewController alloc] init];
    authWebViewController.url = [NSURL URLWithString:[NSString stringWithFormat:@"https://api.twitter.com/oauth/authorize?oauth_token=%@", oauthToken]];

    authWebViewController.completion = ^(TWAuthWebViewController *authViewController, NSURL *oauthCallbackURL)
    {
        // get the request token and verifier from the URL
        NSString *oauthToken = [TWLoginBusiness getOAuthTokenFromURL:oauthCallbackURL];
        NSString *oauthVerifier = [TWLoginBusiness getOAuthVerifierFromURL:oauthCallbackURL];

        // get user data with the oauth token
        [twitter postResource:@"oauth/access_token"
                baseURLString:@"https://api.twitter.com/1.1"
                   parameters:@{@"oauth_verifier" : oauthVerifier}
          uploadProgressBlock:nil
        downloadProgressBlock:nil
                 successBlock:^(NSDictionary *rateLimits, id response)
        {
            NSLog(@"Reponse: %@", response);
            completion(nil, nil);

        } errorBlock:^(NSError *error)
        {
            NSLog(@"Error: %@", error);
            completion(nil, error);
        }];
    };

    presentAuthController(authWebViewController);

} oauthCallback:twitterApiCallback errorBlock:^(NSError *error)
{
    completion(nil, error);
}];

最后一点。此处未列出实际显示Web视图控制器的部分。我想让代码片段专注于实际的API方法,而不是UI逻辑。请放心,authWebViewController.url ....之后的行显示Web视图,然后在用户在Twitter网页上完成身份验证后调用完成块。另外两个方法getOauthTokenFromURL和getOauthVerifierFromUrl确实返回正确的令牌和验证器。 STTwitter库实际上保存了它自己的令牌,这就是为什么它不能手动传递到下面的逻辑中。逻辑生成上面的请求。

由于

1 个答案:

答案 0 :(得分:1)

完整的OAuth流程已在STTwitter库中实现。

通过Safari查看iOS demo基于网络身份验证的工作示例。

您要在此处尝试执行的是基于Web的身份验证。

虽然这完全可行,但我没有在演示项目中包含此工作流程,因为它被认为是一种不好的做法。

事实上,OAuth的观点是用户不想在自己的应用程序中输入她的Twitter凭据,而是要求Twitter发送您的应用专用的OAuth令牌。

如果您需要更多有关STTwitter的帮助,请与我们联系。