DeviseToken Auth не получает данные токена/заголовка для выхода из системы

У меня возникла проблема с выходом из системы devise_token_auth.

Я работаю на основе этих SO:

Как установить заголовок и параметры в axios?

Почему я не могу подписать использовать devise_token_auth и curl?

Это метод аутентификации и уничтожения токена разработки. Он достигает этого метода и останавливается в точке останова.

https://github.com/lynndylanhurley/devise_token_auth/blob/c92258038c05fcc8f6a0374ccce2e63b9f8d5312/app/controllers/devise_token_auth/sessions_controller.rb#L48

    def destroy
      # remove auth instance variables so that after_action does not run
      user = remove_instance_variable(:@resource) if @resource
      client = @token.client
      @token.clear!

      if user && client && user.tokens[client]
        user.tokens.delete(client)
        user.save!

        yield user if block_given?

        render_destroy_success
      else
        render_destroy_error
      end
    end

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

Мой @token равен #<struct DeviseTokenAuth::TokenFactory::Token client=nil, token=nil, token_hash=nil, expiry=nil>, а @resource равен нулю в моей точке останова/верхней части метода.

Запрос клиента (Vue):

 methods: {
      headers() {
        const config = {
          headers: {
            "uid": localStorage.getItem("uid"),
            "client": localStorage.getItem("client"),
            "access-token": localStorage.getItem("access-token")
          }
        }
        return config
      },

      async handleLogOut() {
        // e.preventDefault();
        const headers = this.headers()

        localStorage.removeItem('access-token')
        localStorage.removeItem('uid')
        localStorage.removeItem('client')

        this.logOut();

        let response = await axios.get('api/v1/auth/sign_out', null, headers)
      }
    }

Маршруты:

 destroy_api_user_session GET    /api/v1/auth/sign_out(.:format)                                                          api/v1/sessions#destroy

Что я делаю не так? Как работает метод уничтожения?


person user3738936    schedule 18.02.2021    source источник
comment
Я думаю, почему ваш метод уничтожения не работает, потому что вы используете axios.get(), и я считаю, что вместо этого вам следует использовать axios.delete(), потому что для выхода из разработки используется метод запроса delete.   -  person Khrisna Gunanasurya    schedule 18.02.2021
comment
Я получаю это ActionController::RoutingError (No route matches [DELETE] "/api/v1/auth/sign_out"):, я добавлю маршруты, которые у меня есть. Маршруты могут отличаться для devise и devise_token_auth.   -  person user3738936    schedule 18.02.2021
comment
не могли бы вы показать мне routes.rb? потому что я никогда не использую devise_token_auth, но я думаю, что destroy должен быть методом запроса delete. как в здесь вы можете проверить, что он использует метод delete   -  person Khrisna Gunanasurya    schedule 19.02.2021
comment
ну прямо по умолчанию. Я изменил его в конфигурации, чтобы использовать маршрут получения. config.sign_out_via = :get   -  person user3738936    schedule 19.02.2021
comment
Я вижу, вы уже получили ответ, рад видеть это :)   -  person Khrisna Gunanasurya    schedule 19.02.2021


Ответы (1)


Хорошо, я пропустил этот before_action метод:

https://github.com/lynndylanhurley/devise_token_auth/blob/c92258038c05fcc8f6a0374ccce2e63b9f8d5312/app/controllers/devise_token_auth/concerns/set_user_by_token.rb#L26

Здесь он берет ваши заголовки, проверяет их и устанавливает переменные экземпляра.

Обнаружив это, я понял, что отправлял не те заголовки, которые, как я думал, отправлял. Я изменил свой http-запрос, он отлично работает.

axios.get('api/v1/auth/sign_out', headers)

Боковое примечание: действие выхода из системы по умолчанию в devise — delete, но его можно изменить:

  config.sign_out_via = :get
person user3738936    schedule 19.02.2021