Выход из системы с помощью Devise - создание ненужного запроса DELETE - PullRequest
0 голосов
/ 05 августа 2020

У меня есть Rails API, использующий Devise и интерфейс React. Я сделал кнопку, которая при нажатии использует ax ios, чтобы сделать запрос DELETE к маршруту /users/sign_out (вот как я должен выходить из системы с помощью React & Devise?). Когда я нажимаю кнопку, я получаю ошибку 404 на клиенте и ошибку ниже на сервере. Похоже, что первоначальный запрос выполнен успешно, но затем он пытается сделать еще один запрос DELETE для маршрута /, и пользователь не вышел из системы должным образом. Почему это так?

Started DELETE "/users/sign_out" for ::1 at 2020-08-04 22:59:19 -0700
Processing by Devise::SessionsController#destroy as HTML
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
Can't verify CSRF token authenticity.
Redirected to http://localhost:3000/
Completed 302 Found in 5ms (ActiveRecord: 0.4ms | Allocations: 2069)


Started DELETE "/" for ::1 at 2020-08-04 22:59:19 -0700
  
ActionController::RoutingError (No route matches [DELETE] "/"):

1 Ответ

1 голос
/ 06 августа 2020

Проблема здесь в том, что sign_out на самом деле не работает должным образом. Как видите, в журнале есть сообщение о Can't verify CSRF token authenticity.. У меня есть подозрение, что если вы выйдете из системы, а затем попытаетесь войти без refre sh, это тоже не сработает.

Чтобы исправить это, вы можете выполнить один из следующих двух шагов:

  1. Замените Devise::SessionsController и пропустите проверку токена с помощью skip_before_filter :verify_authenticity_token. Обычно при успешном выходе вы должны увидеть ответ Completed 204 No Content.

Имейте в виду, что при этом будет пропущена проверка токена CSRF, поэтому делайте это только в том случае, если у вас есть другой способ проверки действительности запрос на экс. jwt token

Можно просто отправить токен CSRF с вашим запросом, если вы его действительно используете.
...