web-dev-qa-db-ja.com

Twitterの取得OAuthソーシャルフレームワークを使用したトークン(iOS6)

IOSソーシャルフレームワークを使用してTwitter OAuthトークンを取得する方法について少し混乱しています。iOS6でFacebookとTwitterのアカウントを設定していて、ACAccountを取得できると仮定します。いつFacebook ACAccountのACAccountCredentialを確認しましたが、OAuthTokenプロパティが設定されていますが、Twitter ACAccountの場合は設定されていません。TwitterACAccountの他のすべての詳細は、ACAccountCredentialだけが設定されていません。

混乱を増すために、リバース認証を使用してOAuthトークン( https://dev.Twitter.com/docs/ios/using-reverse)を取得する方法に関する記事に出くわしました。 -auth )。この記事では、 https://api.Twitter.com/oauth/request_token の呼び出しと、oauth_ * params paramsの辞書(consumer_key、nononceなど)の受け渡しについて説明しています。 、確かにACAccountをSLRequestにアタッチすると、この目的が果たされますか?これを試してみると、「検証に失敗しましたoauth署名とトークン」」というエラーが返されます。

だから私の質問は、ACAccountCredentialでTwitter OAuthトークンを表示する必要がありますか、それとも逆認証を使用する必要がありますか?その場合、oauth_ *を含むNSDictionaryを明示的に渡す必要がありますか? paramsまたはACAccountの添付で十分ですか?

23
Click Ahead

いくつかのステップでこれに答えましょう。対処/明確化する必要があることがいくつかあります。

ACAccountCredential

このオブジェクトは、アカウントフレームワークが特定のアカウントのユーザーを認証できるようにするために、ACAccountオブジェクトと連携して使用されます。自由に読めるようには設計されていません。アカウントをアカウントフレームワークに保存する必要がある場合にのみ使用することになっています。

Twitterからのドキュメント 独自のサーバーを使用する代わりに、アカウントフレームワークに移行してユーザーのアカウントを管理する場合、または古いiOSアプリケーションの場合は、ACAccountCredentialを入力する必要があると述べています。アカウントはローカルで。

Appleはドキュメントで明確に述べています アカウントがアカウントフレームワークに保存された後は、資格情報を読み取ることができません。

プライバシー上の理由から、アカウントが保存された後は、このプロパティにアクセスできなくなります。

そのため、サーバー側の管理にOAuthトークンが必要な場合に備えて、Twitterが逆認証を使用する機能を提供するのはこのためです。なぜそれができるのかわかりません。 Facebookアカウントの場合は取得しますが、Twitterの場合は、事前に保存されたACAccountCredentialに直接ジャンプすることはできません。

Twitterの逆認証を使用する

Twitterが提供するドキュメント(質問にリンクされている)は、OAuthアクセストークンにアクセスするために何をする必要があるかについてプロセスをかなり明確にしますが、いくつかのことを明確にしようとしますそれはそれほど明確ではないかもしれません。

これを機能させるには、アカウントとTwitterのフレームワークに加えて、追加のフレームワークが必要です。 Social.framework。トークンのリクエストが非常に簡単になるため、これがインポートされていることを確認してください。

送信する必要のあるリクエストに関しては、TwitterはACAccountsを認識していません。この逆認証プロセスはiOSに固有のものではなく、Webにアクセスできる任意のコンピューティングデバイスで実行できることを忘れないでください。そのため、指定されたパラメーター(OAuth標準パラメーター+ https://api.Twitter.com/oauth/request_token)を使用してHTTP POSTリクエストをx_auth_modeに送信する必要があります)。必要なパラメーターをもう少し明確にします。 ここにあります ただし、質問のリンクから、必要なパラメーターも明確になります。独自のナンスおよびその他のパラメーター値を指定する必要があります。

SLRequestクラスまたはAFNetworkingを使用して、TwitterにPOSTリクエストを送信し、パラメーター値のNSDictionaryを渡すことができます(Twitterのaccess_tokenのドキュメントのコードサンプルを参照)。 。

以上です

これらの2つのポイントに答えた後、ニーズに合った正しいOAuthトークンにアクセスするには、逆認証を使用する必要があることは明らかだと思います。Twitterのドキュメントでは、必要なものが明確になっています。実行する(使用できるコードサンプルも提供します)が、実行するには一般的なOAuth要求/応答管理)に注意する必要があります。単純に添付することはできません。 ACAccount、必要なOAuthパラメーターを辞書に入力し、これをHTTP POST request_tokenへのリクエストに渡す必要があります。Iあなたが参照するためのかなりの数の参照を提供してきました、そしてそれがあなたを正しい道に導くことを願っています。

17
WDUK

> = iOS 5.0でこれを試すと仮定すると、アクセストークンを取得する簡単な方法は次のとおりです。 Twitter.frameworkとSocial.frameworkのどちらを使用しているかに関係なく、両方の作業方法は、リクエストの署名を行うことです。 TWRequestまたはSLRequestのいずれかを使用してリクエストを作成します。これが完了すると、これらのいずれかからNSURLRequestオブジェクトを取得します。

ここでの秘訣は、このNSURLRequestのヘッダーを確認することです。 OAuth標準に従って、いくつかのOAuthパラメーターとoauth_tokenがその1つであるため、簡単に抽出できるはずです。これを取り除く方法です。

NSURLRequest * reqTemp = /* Prepare the request using either Twitter.framework or Social.framework */;
NSDictionary * dictHeaders = [reqTemp allHTTPHeaderFields];

NSString * authString = dictHeaders[@"Authorization"];
NSArray * arrayAuth = [authString componentsSeparatedByString:@","];
NSString * accessToken;
for( NSString * val in arrayAuth ) {
    if( [val rangeOfString:@"oauth_token"].length > 0 ) {
        accessToken =
            [val stringByReplacingOccurrencesOfString:@"\""
                                           withString:@""];
        accessToken =
            [accessToken stringByReplacingOccurrencesOfString:@"oauth_token="
                                                        withString:@""];
        break;
    }
}

このコードはもっと最適化できるかもしれませんが、あなたはその考えを理解します。変数accessTokenには、実際のアクセストークンが含まれます。

7
Deepak G M

実際、唯一の関心事がOAuthトークンを取得することである場合、Socialフレームワークを使用してこれにアクセスする非常に簡単な方法があります。ドキュメント内には次のメソッドがあります。

_func preparedURLRequest() -> NSURLRequest!
_

戻り値ユーザーのパスワードを非公開に保ちながら、アプリがユーザーに代わって動作できるようにするOAuth互換のNSURLRequestオブジェクト。 NSURLRequestは、デフォルトでOAuth1として署名されるか、ユーザーのアカウントに基づいて適切なトークンを追加することによってOAuth2として署名されます。

ディスカッションこのメソッドを使用して、送信する前にリクエストを変更します。アカウントを正しく設定することにより、このメソッドは必要なトークンを自動的に追加します。

したがって、次のように署名されたSLRequestを作成するだけです。

_let accounts = self.accountStore.accountsWithAccountType(type)
let request = SLRequest(
                forServiceType: SLServiceTypeTwitter,
                requestMethod: .GET,
                URL: NSURL(string: "https://api.Twitter.com/1.1/account/verify_credentials.json"),
                parameters: ["include_entities": true])      
request.account = accounts?.first as? ACAccount
_

request.preparedURLRequest().allHTTPHeaderFields()にアクセスするだけで、_oauth_token_が表示されます。

ただし、シークレットトークンはありません( Twitterドキュメント に従って_oauth_signature_を生成するために使用されるため)。これにより、サーバー側の管理にはかなり役に立ちません。

3
apouche

このプロジェクトをチェックしてください https://github.com/seancook/TWReverseAuthExample 。あなたのために仕事をするTWAPIManagerクラスがあります。

1
pprochazka72