Новая последовательность регистрации пользователей для Сервисов 3.4?
Этот комментарий описывает рабочий способ входа в систему с помощью нового токена CSRF:
- ОПУБЛИКОВАТЬ в /rest/пользователь/логин (ничего в заголовках). Создайте файл cookie $ из имени сеанса + идентификатор
- ПЕРЕЙДИТЕ в /сервисы/сеанс/токен (включите $cookie в заголовки). Сохраните возвращенный токен $.
- Включите $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. время ожидания истекло.
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);
Я не тестировал конечную точку создания пользователя, так что это может быть не та структура, которая ему нужна, но проверка ответов на ошибки должна дать вам точное представление о том, что ей нужно. быстро. Из вашего вопроса у меня сложилось впечатление, что в любом случае вас в основном интересуют шаги, ведущие к этому последнему запросу.
Вышеизложенное адаптировано из базового тестового сценария, который я использую, для производственной среды, в которую вы захотите добавить дополнительную проверку ошибок/вменяемости. И функциональность кричит о том, чтобы быть завернутой в класс и расширенной для поддержки ВВОДА/УДАЛЕНИЯ, но я оставлю это вам:)