23

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

さらに混乱を招くのは、リバース認証を使用して OAuth トークンを取得する方法に関する記事 ( https://dev.twitter.com/docs/ios/using-reverse-auth )に出くわしたことです。この記事では、 https: //api.twitter.com/oauth/request_token を呼び出して、oauth_* パラメータ パラメータ (consumer_key、nononce など) の辞書を渡すことについて説明しています。いずれにせよ、これを試してみると、「oauth 署名とトークンの検証に失敗しました」というエラーが返されます。

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

4

4 に答える 4

17

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

ACAccountCredential

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

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

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

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

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

Twitter の逆認証の使用

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

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

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

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

以上です

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

于 2013-02-16T16:41:50.737 に答える
7

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

ここでの秘訣は、この NSURLRequest のヘッダーを調べることです。OAuth 標準に従って、いくつかの OAuth パラメーターとその 1 つである oauth_token を指定する必要があるため、簡単に抽出できるはずです。以下は、これを取得する方法です。

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 には、実際のアクセス トークンが含まれます。

于 2013-07-06T01:02:15.663 に答える
3

実際、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されます。

ただし、Secret トークンはありません ( twitter のドキュメントoauth_signatureに従って生成するために使用されるため)。これにより、サーバー側の管理にはほとんど役に立ちません。

于 2014-09-16T00:20:54.350 に答える
1

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

于 2014-07-18T09:42:35.653 に答える