認証されたRESTリクエストが匿名ユーザーになる


7

servicesおよびrest_serverモジュール(およびRESTful API全体)は初めてです。しかし、私が理解しているように、手順は基本的に次のとおりです。

  1. データに設定されたユーザー名とパスワードを使用して/ api / user / loginに投稿リクエストを送信します
  2. 取得したトークンを応答に格納します
  3. 後続のpostリクエストで、キーX-CSRF-TOKENを使用してトークンをヘッダーに追加します

Postman Chrome拡張機能を使用してそれを実行すると、うまく機能します。コードでそれを行うと、api / user / loginは正常に実行され、トークンを取得しますが、/ api / other / endpointにアクセスしようとすると、ユーザーの匿名エラーにより403 Access deniedが返されます。

最初のリクエスト(/ user / login)は次のようになります:

POST /api/user/login HTTP/1.0
Content-Type: application/json
Accept: application/json
User-Agent: Drupal (+http://drupal.org/)
Host: mysiteurl.com
Content-Length: 41

{"username":"NAME","password":"PASSWORD"}

そして、2番目のリクエスト(/ other / endpoint)は次のようになります。

POST /api/other/endpoint HTTP/1.0
Content-Type: application/json
Accept: application/json
X-CSRF-TOKEN: vGJm5GNDGumf-SoHnLsBU6d46EkrOZkvUY0CSa08GA0
User-Agent: Drupal (+http://drupal.org/)
Host: mysiteurl.com
Content-Length: 0

認証後に/ user / tokenにリクエストを行うと、毎回新しいトークンを取得します。ログインしてすぐにログアウトしようとすると(そしてそのトークンを一緒に送信すると)、「406 Not Acceptable:User not not login。」というメッセージが表示されます。エラー。ユーザーがログインしていないことがわかります。

サイトを確認すると、ユーザーが正常にログインし、その後もログインしていることが表示されます。

セッション名/ IDまたはCookieに関して何かを保存/送信する必要がありますか?私が見てきたことはすべて、セッショントークンのみが必要であることを示唆しています。


Session authenticationアンダーを有効にadmin/structure/services/list/[my-endpoint]してすべてのキャッシュをクリアしましたか?
tyler.frankenstein 2015

はい、はい。まだセッション認証を有効にしていない場合、Postmanで機能することはないと思います。
UnsettlingTrend 2015

わかりました、私はcookieが自動的に処理されるブラウザでのみ経験があります。したがって、JS以外の環境(PHPなど)から呼び出しを行う場合は、ヘッダーのセッションIDも一緒に送信する必要があると思います。通話に使用しているコードは何ですか?
tyler.frankenstein 2015

完全にPHP。セッションIDを追加する必要がある場合、それをヘッダーに追加しますか?そして鍵となるものは何でしょうか。セッション/ sessionid / session-id / etc?私は同じ結果で考えられるあらゆる組み合わせを試しました。
UnsettlingTrend 2015

回答:


2

(私の質問に答えて、サードパーティのように聞こえるようにして、読んだときに理解しやすくします...)

後続の呼び出しは別のクライアントから来ているように見えるため(RESTサーバーの観点から)、それは間違いなくセッション/ Cookieなどと関係があるようです。裸のPHPにはそのCookieを維持する方法がないと思います、ブラウザのように。ここを見ると、リクエストのヘッダーでCookieをそのようにフォーマットする必要があるようです:

Cookie: session_name=sessid

(Cookieは、応答のheaders-> set_cookie変数から取得することもできます。後者には、文字列にすべての有効期限/リンク情報も含まれます。どちらの方法も機能しているようですが、問題があるかどうかはわかりませんどちらかからの影響。最初の方法を使用したのは、それが最初に出会った解決策だったからです。)

session_nameとsessidはどちらも、ユーザー/ログイン要求後の応答のデータ領域から取得できます。したがって、リクエストは最終的にユーザー/ログアウトに対して次のようになります

POST /api/user/logout HTTP/1.0
Content-Type: application/json
Accept: application/json
X-CSRF-Token: igHUQD11Y8LYdyzHi8m5t33U_tCVZNHE6BbptE4mrwQ
Cookie: SESSd3a1acd26f95229c67cd0a9a1e455bd4=rv-Kbyb8znaGlYBBU5Dn7M2GzkYdWnun5aXcVYLVfvY
User-Agent: Drupal (+http://drupal.org/)
Host: mysiteurl.com
Content-Length: 0

同様の問題に直面していますが、テストに基本認証を使用しています。ノードを正常に作成できますPOST /entity/node...が()、後続の編集リクエスト(PATCH /node/123またはDELETE /node/123)は403で失敗します。REST構成のコンテンツルートで基本認証が有効になっています。
aalaap 2017年

0

以前にログインまたはX-CSRFトークン(/ services / session / token)をAPI経由で取得しようとしたときに同じ問題がありましたが、更新時またはリクエスト時に毎回トークンを変更するだけです。私の解決策は、リクエストを送信する前にwithCredentialsをtrueに設定することです。設定した後、ページはセッションCookieを読み取ることができます

例xhr.withCredentials = true;

または私の場合はVueを使用します

Vue.http.interceptors.push((request, next) => {
    request.credentials = true;
    next();
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.