我有一个简单的rails应用devise
和devise-jwt
。我有登录/注销等所有使用User
作为我唯一的范围。但是我登录后无法让gem更新模型上的jti
属性。
我希望gem能够自动执行此操作,但它永远不会更新jti
。
class User < ApplicationRecord
include Devise::JWT::RevocationStrategies::JTIMatcher
devise :database_authenticatable,
:recoverable, :trackable, :validatable,
:jwt_authenticatable, jwt_revocation_strategy: self
def jwt_payload
super.merge({ custom: 'data' })
end
在我的用户迁移中,我有正确的t.string :jti
索引add_index :users, :jti, unique: true
。
我是否必须手动绑定登录回调才能让jti更新? (对于模型中包含的Devise::JWT::RevocationStrategies::JTIMatcher
似乎很奇怪)
答案 0 :(得分:0)
我让它手动工作。不得不进行更新:
# user.rb
def jwt_payload
self.jti = self.class.generate_jti
self.save
# super isn't doing anything useful, but if the gem updates i'll want it to be safe
super.merge({
jti: self.jti,
usr: self.id,
...
})
end
我看了https://github.com/waiting-for-dev/devise-jwt/blob/958cab34287f9985aacc84fedbbb3ea508f6c3b2/lib/devise/jwt/revocation_strategies/jti_matcher.rb,但无法弄清楚为什么调用super
会返回{ jti: nil}
?
很想看到更好的方法。