如何解决Rails devise-jwt会话存储
devise-jwt gem文档说,如果启用了会话存储,则必须跳过它进行jwt身份验证。它说您应该在devise.rb上设置:
config.skip_session_storage = [:http_auth,:params_auth]
并且您应该禁用:database_authenticatable。这部分我完全不了解。如果在我的用户模型中删除了:database_authenticatable,则配置用于登录的路由不可用:
ActionController :: RoutingError(没有路由与[POST]“ / login”匹配):
User.rb
class User < ApplicationRecord
rolify role_join_table_name: 'public.user_roles'
# Include default devise modules. Others available are:
# :confirmable,:lockable,:timeoutable,:trackable and :omniauthable
# devise :database_authenticatable,devise :registerable,:recoverable,:rememberable,:validatable,:jwt_authenticatable,jwt_revocation_strategy: Devise::JWT::RevocationStrategies::Null
end
devise.rb
config.skip_session_storage = %i[http_auth params_auth]
routes.rb
Rails.application.routes.draw do
# For details on the DSL available within this file,see https://guides.rubyonrails.org/routing.html
devise_for :users,defaults: { format: :json },path: '',path_names: {
sign_in: 'login',sign_out: 'logout',registration: 'signup'
},controllers: {
sessions: 'users/sessions',registrations: 'users/registrations'
}
end
我应该怎么做才能保持会话状态,而不是jwt auth?
解决方法
嗯,在适应了我在本文https://blog.siliconjungles.io/devise-jwt-with-sessions-hybrid中找到的解决方案之后,答案如下:
monkeypatch:config / initializers / warden / proxy.rb
module Warden
class Proxy
def user(_argument = {})
if request.format.json?
return nil
end
end
end
end
并且您必须具有用于api身份验证和默认行为的单独路由:
routes.rb
namespace :api do
namespace :v1 do
devise_scope :user do
post 'auth/signup',to: 'registrations#create'
post 'auth/signin',to: 'sessions#create'
delete 'auth/signout',to: 'sessions#destroy'
end
end
end
devise_for :users
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。