0

このガイドに従って、Webで2つのレッグOAuthサービスを構成しました:http: //drupal.org/node/1827698

構成がすべて適切であると確信しています。Webブラウザーを介してベースURL+サービスエンドポイントを使用してWebサービスをトリガーすると、ブラウザーから次のエラーが返されます。

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<result>The request must be signed</result>

これは、認証エラーであることを示唆しています。私は考えます。

今、iPhoneプロジェクトでRestkitを使用する計画があります。このガイドに従って、単純な2本足のOAuth Webサービスリクエストを書き留めました: https ://github.com/RestKit/RestKit/wiki/OAuth-Support-on-RestKit

そしてこれは私のコードです:

    NSString *urlResource = @"";
    urlResource = @"/service_endpoint/node";
    RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURLString:@"http://mydomain.com/"];
    [RKObjectManager setSharedManager:objectManager];
    objectManager.client.OAuth1ConsumerKey = @"proper_consumer_key";
    objectManager.client.OAuth1ConsumerSecret = @"proper_consumer_secret";
    objectManager.client.OAuth1AccessToken = nil;
    objectManager.client.OAuth1AccessTokenSecret = nil;
    objectManager.client.authenticationType = RKRequestAuthenticationTypeOAuth1;
#define USE_GET_REQUEST 0
#if USE_GET_REQUEST
    [objectManager.client get:urlResource delegate:self];
#else
    NSDictionary *theParams = nil;
    NSString *timeStamp = [[NSNumber numberWithInt:(NSTimeInterval)[[NSDate date] timeIntervalSince1970]] stringValue];
    theParams = [NSDictionary dictionaryWithObjectsAndKeys:@"1.0", @"oauth_version", @"HMAC-SHA1", @"oauth_signature_method", timeStamp, @"oauth_timestamp", nil];
    [objectManager.client post:urlResource
                        params:theParams
                      delegate:self];
#endif

投稿に示されているように、以前にGETリクエストを試してみました。データのない空の本文が表示され、Restkitがこれをログに記録します。これは、認証の問題を示しています。

2012-11-06 19:27:46.887 MyProject OAuth [22187:11603] I restkit.network:RKRequest.m:689ステータスコード:401

Restkitはこの方法でパラメーターを追加しないため、リクエストは使用する署名、タイムスタンプ、OAuthバージョンを認識していません。したがって、これらのパラメーターを指定できるPOSTリクエストを使用して同じことを試しました。今でも私は空のボディを取得し、Restkitログはこれを示しています:

2012-11-06 19:28:03.231 MyProject OAuth [22205:11603] I restkit.network:RKRequest.m:689ステータスコード:404

どこが間違っているのか、他に何をしようとしているのかわかりません!この問題の解決に役立つことを楽しみにしています。

編集: 私は不足しているコールバックメソッドを実装しました、そして今得ています:

「リクエストには署名する必要があります」

メッセージ。参照リンクに記載されているように、上記の設定でOAuth認証に十分だったと思いますが、他に何をする必要がありますか?

観察

RestKitコードの内部とOAuthパラメーターがURLリクエストのHTTPヘッダーフィールドに配置されていることがわかりました。しかし、Drupal 7がHTTPヘッダーフィールドからこの情報を読み取ることができるかどうかはわかりません。これは、常に私を返すためです。

リクエストに署名する必要があります

これは、最初のケースではOAuthパラメーターがDrupalによって受信されないことを意味します。そうでない場合、少なくとも次のエラーが発生します。

無効な署名

コンシューマーキーとシークレット、およびその他すべてのセットアップがサーバー側で適切に行われているかどうかを確認するために、他のいくつかのオプションを探していました。これを確認するために、ここからphpOAuthクライアントスクリプトをダウンロードしました。ここからSVNコードをダウンロードします。PHPクライアントでリクエストをクロスチェックすると、リクエストはすべて完全に処理され、エンドポイント、コンシューマーキー、コンシューマーシークレットを入力するだけでxmlが返されます。

もう1つ試したのは、GCOAuthが署名とすべてをRestkit内に生成できるようにし、ブレークポイントを配置してHTTPヘッダーフィールドをログにダンプできるようにすることです。Restkitがサーバーにリクエストを送信する代わりに、URLをすばやく準備しました。上記のPHPクライアントとまったく同じ形式でリクエストします。このリクエストがトリガーされると、

無効な署名

応答、これはまた、OAuthパラメーターがRestkit / GCOAuthで適切に準備されていないことを意味しますか?

ありがとう、ラジ

4

1 に答える 1

0

Restkitのクラスを変更することで解決できました。上記の質問で述べた私の観察によると、一部の Web サーバー (この場合は Drupal 7 としましょう) の制限であると私が想定しているものを理解することができました。私が出会った iOS 用のほとんどすべての OAuth ライブラリで、OAuth 認証パラメータはリクエストの HTTP ヘッダー フィールドに設定されていました。

上記の観察で述べたように、適切なコンシューマ キーとコンシューマ シークレットを提供すると、oauth_nonce 文字列、タイムスタンプが生成され、URL のクエリ パラメータ内に oauth_signature も提供されるPHP クライアントに出会いました。この機能は、Restkit のライブラリにはありませんでした (推測しますか?)。Restkit は GCOAuth によって提供されるすべての情報を HTTP ヘッダー フィールドに入力しますが、私の Drupal 7 Web サーバーが何らかの形でそれを読み取っていないか、HTTP ヘッダー フィールドに間違ったキーを使用していた可能性があります。Drupal 7 のドキュメントを検索して、HTTP ヘッダー フィールドにパラメータを渡す方法とそこから読み取る方法について調べましたが、あまり役に立ちませんでした。

したがって、私の解決策は、前述のPHP クライアントと同じように URL 要求を作成することでした。GCOAuth クラス、RKClient & RKRequest クラス内のほとんどすべてが Restkit によって行われました。私がしなければならなかったのは、OAuth パラメーターがリクエスト URL に追加されるように微調整することだけでした。github の Restkit の分岐コードにプッシュしたすべての変更。この OAuth モジュールに固有の私の変更は、プロジェクトで検索できる「// Raj OAuth:」でコメントされています。

以下は、Web サービスをトリガーして使用するために使用したコードです。今のところ、RKClient の-get:delegate:メソッドにオーバーロードされた指定メソッドを提供しました。必要に応じて、他のすべての利用可能なメソッドに同じことを拡張できると思います。

-(void)triggerOAuthRequest
{
    NSString *urlResource = @"";
    urlResource = @"/endpoint_path/endpoint.xml";
    NSString *baseURL = @"http://your_domain_name.com/path_to_drupal_home_folder/";
    NSString *consumerKey = @"YW9h6tUc*************";
    NSString *consumerSecret = @"HUS2ALAC*************";

    RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURLString:baseURL];
    [RKObjectManager setSharedManager:objectManager];
    objectManager.client.OAuth1ConsumerKey = consumerKey;
    objectManager.client.OAuth1ConsumerSecret = consumerSecret;
    objectManager.client.OAuth1AccessToken = nil;
    objectManager.client.OAuth1AccessTokenSecret = nil;
    objectManager.client.authenticationType = RKRequestAuthenticationTypeOAuth1;
    [objectManager.client get:urlResource
                     delegate:self
constructOAuthQueryParamsInURL:YES];
}

また、このリクエストを送信することは、OAuth パラメータがクライアント エンドで秘密のコンシューマ キーで署名され、その後リクエストがサーバーに送信されるという事実に対して十分に安全であると想定していますが、URL 自体にはクエリ パラメータがあります。 oauth_signature は秘密のコンシューマ キーで署名されているので安全です。このキーは Web サーバーのみが復号化して、リクエストが本物のソースからのものかどうかを確認できます。

改善の余地があると思われる場合は、お知らせください。

ありがとう、

ラージ

于 2012-11-09T05:46:17.660 に答える