如何使用经过令牌验证的用户销毁会话("注销")

Jo *_*iss 6 ruby-on-rails devise

对于使用的Devise用户模型,:token_authenticatable如此

class Voter < ActiveRecord::Base
  devise :token_authenticatable
end
Run Code Online (Sandbox Code Playgroud)

曾经有一个被称为的路由destroy_user_session,因此你可以通过链接来记录用户destroy_user_session_path.这似乎在最近的版本中已经改变 - 现在只:database_authenticatable为我创建一个销毁路线.

因此,对于使用令牌身份验证的用户,实施"注销"/"注销"操作以结束其会话的正确方法是什么?

Mat*_*ira 5

默认情况下,当您通过令牌登录时,Devise会将用户存储在会话中,就像在数据库身份验证策略中一样.

您可以通过在Devise初始化程序中设置stateless_token为禁用它true:

Devise.setup do |config|
  config.stateless_token = true
end
Run Code Online (Sandbox Code Playgroud)

这样,必须为每个请求提供令牌.


据我了解,令牌认证旨在与数据库身份验证一起使用.devise_for如果您的模型是,则只会添加会话路由database_authenticatable.这似乎是对Devise的一个小小的疏忽,但在我看来,访问令牌让用户在会话中对我开始没有多大意义.

无论如何,尝试手动定义到Devise会话的路由.

改编自Devise的路由助手(未经测试的代码):

as :user do  # User scope
  resource :session, :controller => 'devise/sessions' do
    # new_user_session | GET /users/sign_in => devise/sessions#new
    get :new, :path => 'sign_in', :as => "new"

    # user_session | POST /users/sign_in => devise/sessions#create
    post :create, :path => 'sign_in'

    # destroy_user_session | GET /users/sign_out => devise/sessions#destroy
    get :destroy, :path => 'sign_out', :as => "destroy"
  end
end
Run Code Online (Sandbox Code Playgroud)

在任何情况下,帮助程序的文档devise_for都指定了创建哪些路由以及它们指向的路径.