我正在使用以下代码来处理我的应用程序中的twitter集成。
- (IBAction)signInWithTwitter:(id)sender {
NSURL *requestURL = [NSURL URLWithString:@"https://api.twitter.com/oauth/request_token"];
NSURL *accessURL = [NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"];
NSURL *authorizeURL = [NSURL URLWithString:@"https://api.twitter.com/oauth/authorize"];
NSString *scope = @"http://api.twitter.com/";
GTMOAuthAuthentication *auth = [self authForTwitter];
[auth setCallback:@"http://www.noop.com/OAuthCallback"];
GTMOAuthViewControllerTouch *viewController;
viewController = [[GTMOAuthViewControllerTouch alloc] initWithScope:scope
language:nil
requestTokenURL:requestURL
authorizeTokenURL:authorizeURL
accessTokenURL:accessURL
authentication:auth
appServiceName:@"CK12: Twitter"
delegate:self
finishedSelector:@selector(viewController:finishedWithAuth:error:)];
}
- (GTMOAuthAuthentication *)authForTwitter {
GTMOAuthAuthentication *auth = [[GTMOAuthAuthentication alloc] initWithSignatureMethod:kGTMOAuthSignatureMethodHMAC_SHA1
consumerKey:TWITTER_CONSUMER_KEY
privateKey:TWITTER_CONSUMER_SECRET];
[auth setServiceProvider:@"Twitter"];
return auth;
}
我的问题是,如果我正在改变设备时间,即延迟1小时,那么我会收到以下错误:
Error Domain=com.google.HTTPStatus Code=401 and error message is : failed to validate oauth signature and token .
所以有人可以建议如何解决这个问题。如果系统时间错误,那么我也想让它工作。
答案 0 :(得分:0)
最后我得到了解决方案。 。 。
我们收到此错误的原因之一“无法验证OAuth签名和令牌” 当系统时间错误时。因为OAuth请求带有系统时间戳参数,所以当设备时间不在twitter服务器时间的5分钟内时。我们得到“无法验证OAuth签名和令牌”。
如果设备时间错误,有两种方法可以使其正常工作。
1.将HTTP HEAD请求发送到api.twitter.com上的端点 - 您将在响应中获得一个Date HTTP标头,指示Twitter可以理解的当前时间。然后,您可以将其转换为纪元时间,并根据确定的偏移量调整oauth_timestamp值。
2.有一个名为ios-ntp链接的小型iOS库:http://code.google.com/p/ios-ntp。用它来获得当前的准确时间。
之后,我只需在以下方法中设置OAuth对象的时间戳
- (GTMOAuthAuthentication *)authForTwitter
{
GTMOAuthAuthentication *auth = [[GTMOAuthAuthentication alloc]
initWithSignatureMethod:kGTMOAuthSignatureMethodHMAC_SHA1
consumerKey:TWITTER_CONSUMER_KEY
privateKey:TWITTER_CONSUMER_SECRET];
[auth setServiceProvider:@"Twitter"];
NSDate * currentdate = //GET ACCURATE DATE HERE ;
[auth setTimestamp:[NSString stringWithFormat:@"%f",[currentdate timeIntervalSince1970]]];
return auth;
}
就是这样。 。 。快乐的编码:)