0

我一直在研究使用完整 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 库实际上保存了它自己的令牌,所以这就是为什么它没有手动传递到下面的逻辑中。逻辑生成上面的请求。

谢谢

4

1 回答 1

1

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

查看iOS 演示,了解通过 Safari 进行基于 Web 的身份验证的工作示例。

您在这里尝试做的是应用程序内部的基于 Web 的身份验证。

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

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

如果您需要更多关于 STTwitter 的帮助,请告诉我。

于 2014-04-17T13:42:48.727 回答