web-dev-qa-db-ja.com

Authenticated REST匿名ユーザーになるリクエスト

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

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

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

最初のリクエスト(/ 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に関して何かを保存/送信する必要がありますか?私が見てきたことはすべて、セッショントークンのみが必要であることを示唆しています。

7
UnsettlingTrend

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

後続の呼び出しは別のクライアントから送信されているように見えるため(RESTサーバーの観点から)、私は推測しているようです。 bare PHPには、ブラウザのようにCookieを維持する方法がありません。 here を調べたところ、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
2
UnsettlingTrend

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

例xhr.withCredentials = true;

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

Vue.http.interceptors.Push((request, next) => {
    request.credentials = true;
    next();
});
0
Jry