web-dev-qa-db-ja.com

サービス3.4の新しいユーザー登録シーケンス?

このコメント は、新しいCSRFトークンでログインするための有効な方法の概要を示しています。

  1. / rest/user/loginへのPOST(ヘッダーには何もありません)。セッション名+ IDから$ cookieを構築します
  2. / services/session/tokenにGETします(ヘッダーに$ cookieを含めます)。返された$ tokenを保存します。
  3. ログインしたユーザーの後続のリクエストのヘッダーに$ cookieと$ tokenを含めます。

最初のPOSTはトークンを送信せずに発生しますが、そのシーケンスは機能します。(ドキュメントでは、トークンはすべてのPOSTリクエストに使用する必要があることを示唆しています。この場合は機能します。)

新しいユーザーアカウントをregisterするHTTPリクエストの動作シーケンスとは?実装コードではなく、どのような要求をどの順序で行うかを探しています。

更新:明確にするために、私はloginシーケンスを探していません。新規ユーザーがアカウントを*register*できるようにする一連のリクエスト(上記のログイン例と同様)が必要です。

システム/接続での失敗した試行:

 1。 GET:services/session/token 
 
 2。 POST:system/connect 
 Content-Type:application/json 
 Accepts:application/json 
 
 3。 POST:user/register 
 Content-Type:application/json 
 Accepts:application/json 
 X-CSRF-Token:[token] 
 Cookie:[session_name ] = [sessid] 
本文:{
 "name": "drupalspec0rVzsWAU"、
 "pass": "PYKSItFK"、
 "mail": "drupalspec0rVzsWAU @ drupalspec.com "
} 

Drupalユーザーは正しく作成されますが、ステップ3の要求はタイムアウトします。

6
Joe Beuckman

編集:質問の変更に対処する

実装コードではなく、どのような順序でどのようなリクエストを行うかを探しています

以下の実際のコードの実装は無視してかまいません。リクエストの順序は同じです。実際、元の質問とまったく同じです。

すでに説明した順序でリクエストを行っている場合は、実際の実装を提供する以外に何もする必要はありません。コードは例として残しますので、リクエストを実行する必要がある順序を正確に確認できます。わかりやすくするために、番号を付けておきました。リクエストは1、2、3で示されます。


これは基本的なPHP(つまり、Drupal以外))の例です...

まず、リクエストを送信するための汎用関数を作成します。

function send_request($url, array $post_array = array(), $cookie = NULL, $token = NULL) {
  $ch = curl_init();

  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_USERAGENT, 'googlebot');
  //curl_setopt($ch, CURLOPT_VERBOSE, $post_array);

  if (!empty($post_array)) {
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_array);
  }

  if ($cookie) {
    curl_setopt($ch, CURLOPT_COOKIE, $cookie);
  }

  if ($token) {
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-CSRF-Token: ' . $token));
  }

  $result = curl_exec($ch);
  curl_close($ch);

  return $result;
}

1。次に、最初の呼び出しを行ってユーザーをログインさせます。

// Login.
$data = array(
  'username' => 'user',
  'password' => 'password',
);

$result = send_request("http://server/endpoint/user/login.json", $data);

try {
  $result = json_decode($result);
}
catch (Exception $e) {
  die('Login failed: ' . $e->getMessage());
}

次に、セッション名とIDを取得し、後続のリクエストで送信するCookie文字列を作成します。

$session_id = $result->sessid;
$session_name = $result->session_name;    
$cookie = $session_name . '=' . $session_id;

2。次に、CSRFトークンを取得し、必ずCookieを渡してください。

$token = send_request("http://server/services/session/token", array(), $cookie);

。最後に、実際に関心のあるエンドポイントに対してリクエストを実行できます。Cookieとトークンは、send_request()関数によって挿入されます。

$user = array(
  'mail' => '[email protected]',
  'name' => 'name',
  // Other relevant properties/fields.
);

$result = send_request('http://server/endpoint/user', $user, $cookie, $token);

私はユーザー作成エンドポイントをテストしていないため、必要な構造とは正確に一致しない可能性がありますが、エラーの応答を確認すると、その後の結果が正確にわかるはずです。とにかく、最後のリクエストに至るまでのステップに主に関心があるという印象を受けました。

上記は、私が使用する基本的なテストスクリプトを基にしています。本番環境では、エラー/健全性チェックをさらに追加する必要があります。そして、機能はクラスにラップされ、PUT/DELETEをサポートするように拡張されることを叫んでいますが、それはあなたにお任せします:)

5
Clive