Не работает выход из React и Rails Devise

#javascript #ruby-on-rails #reactjs #devise #routes

#javascript #ruby-on-rails #reactjs #разработка #маршруты

Вопрос:

Я использую React Rails для веб-приложения и использую Devise для аутентификации пользователей. Я изо всех сил пытаюсь заставить работать пользовательскую кнопку выхода из системы.

В моем routes.rb у меня есть следующее:

 devise_for :users do
  delete '/users/sign_out' => 'devise/sessions#destroy' #I've also tried get instead of delete
end
  

Мой devise.rb настроен следующим образом:

 config.sign_out_via = :delete
  

В моем файле (React) JS .jsx у меня есть следующая функция выхода из системы, вызываемая при нажатии кнопки.

 function logout() {
    fetch("/users/sign_out", {method: 'delete'}).then((response) => { #I have also tried replacing delete with get
   }).then((result) => {
     window.location.href = '/';
   });
}
  

Когда я использую fetch delete, я получаю ошибку get 422 при выборке; когда я использую fetch get, я получаю ошибку 404 при выборке. Я экспериментировал с различными возможными перестановками get / delete в файлах routes / devise.rb и файле .jsx, но безуспешно.

В частности, из моей консоли rails я вижу следующее для ошибки 422:

 Can't verify CSRF token authenticity. Completed 422 Unprocessable Entity in 4ms (ActiveRecord: 0.5ms) 
  

Мой контроллер приложения имеет следующее:

 class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception
    before_action :authenticate_user!
end 
  

Интересно, если я сделаю это:

 class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception
    protect_from_forgery prepend: true
    before_action :authenticate_user!
end 
  

Затем ошибка 422 исчезает (но приложение по-прежнему действует так, как будто пользователь вошел в систему).

Комментарии:

1. какую ошибку вы получаете при использовании fetch delete?

2. Что у вас есть в журнале сервера rails с method: 'delete' ?

3. Не удается проверить подлинность токена CSRF. Завершено 422 необработанных объекта за 4 мс (ActiveRecord: 0,5 мс)

4. @biocompamateur, отлично! И что вы делаете с токенами CSRF в других действиях devise?

5. На самом деле я ничего не делаю с токенами CSRF (кроме того, что делается с помощью встроенной функциональности devise)

Ответ №1:

У меня тот же стек (redux / rails), я получаю 201, пока не уверен, что он правильный, но, возможно, эта функция поможет вам для токена CRSF:

     export const getMetaContent = (name) => {
    var metas = document.getElementsByTagName('meta');

    for (var i=0; i<metas.length; i  ) {
      if (metas[i].getAttribute("name") == name) {
        return metas[i].getAttribute("content");
      }
    }
}
// credit : https://labs.chiedo.com/post/authenticating-your-reactjs-app-with-devise-no-extra-gems-needed/
  

И тогда мой запрос на удаление в моей саге для / users / signout выглядит следующим образом:

   logoutUser = () => {
    console.log("CHIIII");
    const url = "users/sign_out.json";
    const options = {
      method: 'DELETE',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      },
      data: {
        authenticity_token: getMetaContent("csrf-token")
      }
    }
      fetch(url, options)
      .then(response => {
        resolve(response)
      })
      .catch(error => console.log(error))