我一直致力于使用完整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库实际上保存了它自己的令牌,这就是为什么它不能手动传递到下面的逻辑中。逻辑生成上面的请求。
由于
答案 0 :(得分:1)
完整的OAuth流程已在STTwitter库中实现。
通过Safari查看iOS demo基于网络身份验证的工作示例。
您要在此处尝试执行的是基于Web的身份验证。
虽然这完全可行,但我没有在演示项目中包含此工作流程,因为它被认为是一种不好的做法。
事实上,OAuth的观点是用户不想在自己的应用程序中输入她的Twitter凭据,而是要求Twitter发送您的应用专用的OAuth令牌。
如果您需要更多有关STTwitter的帮助,请与我们联系。