2012-01-04 6 views
3

私はプロジェクトで作業しています。クライアントはOAuthを使用して、私が構築したカスタムサービスを保護しています。私は、認証とセッション認証を使用しないで、すべてがうまく動作していますが、OAuthを使用すると全体が崩れてしまいます。私はステップチュートリアルで本当に良いステップを見つけることができませんでした。Drupal 6/Services 3でOAuthを動作させることができません

D6には、基本的に私はサービス6.x-3.1とOAuth 6.x-3.0-beta4モジュールがインストールされています。 this documentationを使用してoauthコンテキストを作成しました。それから私はすべてのクライアントの消費者資格情報を1セットだけ作成したいので、ダミーユーザーをセットアップしました。私はコンテキストをユーザとサービスに割り当てました。私はhttp://mydomain/oauth/authorizedをコールバックURLとして使用しています。

テストするには、http://term.ie/oauth/example/client.phpを使用して接続します。私はエンドポイントhttp://mydomain/oauth/request_tokenを使用します。適切なフィールドに応答トークンを追加します。次に、エンドポイントをhttp://mydomain/oauth/authorizeに変更します。私は接続を許可するためにクリックする必要があるページに私を連れて行く。私は成功メッセージを受け取るhttp://mydomain/oauth/authorizedページに連れて行きます。

ここで、エンドポイントをhttp://mydomain/oauth/access_tokenに変更し、新しいトークンで応答します。 these instructionsによれば、新しいアクセストークンを置き換えて、エンドポイントをhttp://mydomain/myserviceendpointに変更します。それはGETリクエストを使用して接続します。

401未許可:コンシューマには サービスにアクセスする権限がありません。

私は何かが不足しているように感じます。システムにはコンテキストが1つしかなく、コンシューマとサービスの両方に割り当てられています。コンシューマキーとシークレットは、アクセストークンとともに最終的なURLの一部です。私はパーミッションを見て、何も見つけられません。私はサービスを変更して、hook_services_accessのTRUEを返してパーミッションをバイパスしました。

アイデア?

+0

あなたの問題はまだ解決しましたか?私は同じ問題を抱えていて、文書のどこにも見つからなかった。 –

答えて

1

まず、2つの違いを理解する必要があります。

  1. 最初に、セッション認証ではユーザー名とパスワードを取得し、認証します。次に、drupalからのユーザー権限が必要になるので、各ステップで認証して、drupalと通信するアプリケーションを実行する必要があります。匿名ユーザーはdrupalのあなたの許可に従って望むものを得ることができます。

  2. Aouth認証では、ユーザーを作成してトークンを追加し、トークンを持っているユーザーだけが、自分に設定したアクセス許可規則に従ってアプリケーションと通信します。匿名ユーザーの場合は、何も取得または取得できません。 drupalと作成されたクライアントの間の通信は、特定のトークンとともに使用されます。

  3. 最後に、ユーザーページに移動してユーザーを作成し、アプリケーション名にもトークンを付け、アプリケーションコードにアプリケーションにトークンを与え、新しく作成したユーザーで認証します。

新しく作成されたユーザーのアクセス許可を確認する必要があります。

チェックthis link

0

あなたのサービスエンドポイントは、OAuthのテストクライアントで使用されるものではありません。認証されたら、OAuthトークンをメソッドと共にサービスエンドポイントに渡します。

0

あなたと同じ問題...本当に良いチュートリアルはありませんが、時にはそのハードなので、これが誰かを助けることを願っています。

ソリューション:

あなたは(my_module_default_services_endpointで、エンドポイント定義であなたのリソースへのOAuth permisionsを与えなければなりません)。 oauthを介してリソースユーザーを有効にしたいとしましょう。通常、あなたが持っているでしょう:「services_oauth」を介して、あなたが有効

... 
    $endpoint->resources['user'] = array(
    'operations'  => array(
     'ta_create'  => array('enabled' => 1, 'services_oauth' => array('credentials' => 'token', 'authorization' => 'user_info',),), 
    ), 
    'actions'   => array(
     'login'   => array('enabled' => 1,), 
     'logout'   => array('enabled' => 1, 'services_oauth' => array('credentials' => 'token', 'authorization' => 'user_info',),), 
     'ta_register'  => array('enabled' => 1,), 
    ), 
); 
... 

もの:

... 
    $endpoint->resources['user'] = array(
    'operations'  => array(
     'ta_create'  => array('enabled' => 1,), 
    ), 
    'actions'   => array(
     'login'   => array('enabled' => 1,), 
     'logout'   => array('enabled' => 1,), 
     'ta_register'  => array('enabled' => 1,), 
    ), 
); 
... 

をですから、このようなあなたのリソースを認可しなければならない(「USER_INFO」は、このリソースにアクセスするために必要なpermisionです) oauth経由でのみアクセスできます。 oauthアクセスサービスと通常のoauthサービスを混在させることができるかどうか疑問に思っています。

あなたがサービスのデバッグを有効にした場合、あなたは以下のPHPの警告に気づくでしょう:

お知らせ:未定義のインデックス:services_oauthエン_services_oauth_authenticate_call()(リネア26・デ・Cを、私は解決策を見つけた方法

:/.../ services_oauth.inc)。あなたは(http://php.net/manual/en/function.debug-print-backtrace.phpのおかげで)services_oauth.incに()_services_oauth_authenticate_callとスタックトレースを印刷する行けば

ob_start(); 
debug_print_backtrace(); 
$trace = ob_get_contents(); 
ob_end_clean(); 
watchdog('my_module', 'StackTrace: %st', array('%st' => $trace,), WATCHDOG_DEBUG); 

は、その後、あなたはその*の$方法[ 'エンドポイント'] [ 'services_oauth' を表示されます]; *は設定されていません。だからあなたはmy_module_default_services_endpoint()に設定する必要があります

関連する問題