0

次のコードを使用して、アプリケーションで 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 .

だから、誰でもこれを解決する方法を提案してください。システム時刻が間違っている場合も、それを機能させたいと思います。

4

1 に答える 1

0

最後に、これに対する解決策を得ました。. . .

システム時刻が間違っていると、「OAuth 署名とトークンの検証に失敗しました」というエラーが表示される理由の 1 つです。OAuth リクエストにはシステムのタイムスタンプ パラメータが含まれているため、デバイスの時刻が Twitter サーバーの時刻の 5 分以内にない場合、「OAuth 署名とトークンの検証に失敗しました」というメッセージが表示されます。

デバイスの時刻が間違っていても、それを機能させる方法は 2 つあります。

1. api.twitter.com のエンドポイントに HTTP HEAD 要求を送信します。応答で、Twitter が認識した現在の時刻を示す Date HTTP ヘッダーを取得します。次に、これをエポック時間に変換し、決定されたオフセットによって oauth_timestamp 値を調整します。

2. ios-ntp リンクという名前の小さな iOS ライブラリがあります: http://code.google.com/p/ios-ntp。これを使用して、現在の Accurate time を取得します。

その後、次のメソッドで 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;
}

それでおしまい 。. .ハッピーコーディング:)

于 2013-09-04T12:57:58.610 に答える