Новая последовательность регистрации пользователей для Сервисов 3.4?


Этот комментарий описывает рабочий способ входа в систему с помощью нового токена CSRF:

  1. ОПУБЛИКОВАТЬ в /rest/пользователь/логин (ничего в заголовках). Создайте файл cookie $ из имени сеанса + идентификатор
  2. ПЕРЕЙДИТЕ в /сервисы/сеанс/токен (включите $cookie в заголовки). Сохраните возвращенный токен $.
  3. Включите $cookie и $токен в заголовки последующих запросов вошедшего в систему пользователя.

Эта последовательность работает, даже если происходит первое сообщение без отправки токена. (Документация предполагает, что токен следует использовать для любых запросов POST, что в данном случае не работает.)

Какова рабочая последовательность 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]
      Body: {
               "name":"drupalspec0rVzsWAU",
               "pass":"PYKSItFK",
               "mail":"[email protected]"
      }

Пользователь Drupal создан правильно, но запрос на шаге 3. время ожидания истекло.

Author: Joe Beuckman, 2013-07-17

1 answers

Изменить: для устранения изменений в вопросе

Я ищу, какие запросы делать в каком порядке, а не код реализации

Вы можете смело игнорировать приведенную ниже фактическую реализацию кода - порядок запросов остается прежним. На самом деле, точно так же, как и в вашем первоначальном вопросе.

Если вы уже делаете запросы в указанном порядке, вам больше ничего не нужно делать, кроме как предоставить фактическую реализацию. Я оставлю используйте код в качестве примера, чтобы вы могли точно видеть, в каком порядке нужно выполнять запросы. Я вставил некоторую нумерацию, чтобы сделать ее более очевидной; запросы обозначаются 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());
}

Затем получите имя и идентификатор сеанса, создав строку 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);

3. Наконец, вы можете выполнить свой запрос до конечной точки, которая вас действительно интересует. Файл cookie и токен вводятся функцией send_request().

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

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

Я не тестировал конечную точку создания пользователя, так что это может быть не та структура, которая ему нужна, но проверка ответов на ошибки должна дать вам точное представление о том, что ей нужно. быстро. Из вашего вопроса у меня сложилось впечатление, что в любом случае вас в основном интересуют шаги, ведущие к этому последнему запросу.

Вышеизложенное адаптировано из базового тестового сценария, который я использую, для производственной среды, в которую вы захотите добавить дополнительную проверку ошибок/вменяемости. И функциональность кричит о том, чтобы быть завернутой в класс и расширенной для поддержки ВВОДА/УДАЛЕНИЯ, но я оставлю это вам:)

 5
Author: Clive, 2013-07-23 15:54:04