raails devise-jwt gem在登录后没有更新用户的jti?

时间:2018-06-01 06:18:48

标签: ruby-on-rails devise jwt ruby-on-rails-5

我有一个简单的rails应用devisedevise-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似乎很奇怪)

1 个答案:

答案 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}

很想看到更好的方法。