Rails5 API + devise_token_auth 编辑令牌格式

Rails5 API + devise_token_auth edit token format

所以我使用 devise_token_auth gem 来实现基本的用户功能,并且我对重置密码流程进行了一些简单的更改。基本上,我没有在电子邮件中包含 link 供用户单击并转到重置页面,而是显示令牌,因此用户必须复制它并在字段中手动输入。

它是这样工作的,但令牌又大又丑,我希望它是 6 位字母数字。它看起来更好,并且使用户更容易。我不太清楚该怎么做,我可能应该覆盖一些设计的原始控制器。怎么做?由于 devise_token_auth 放置了每个原始设计控制器的控制器 "on top",我想要的是从设计的可恢复模块中覆盖 set_reset_password_token。

编辑:我自己找到了答案,所以我会在下面回答!但是,请随时投诉、询问并提出 better/alternative 解决方案。

所以,首先,如果你想覆盖设计模块中的一个函数,你可以在你的模型文件中用相同的名字写它,可能在 models/user.rb 中。要从可恢复模块覆盖 set_reset_password,您只需执行以下操作(如 Sergio Tulentsev 所建议):

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable, :lockable
  ...

  protected
    def set_reset_password_token
      ...
    end
end

现在改变你想要的原始令牌的样子(在它被加密之前),在我的例子中我希望它有 6 位数字,只包含 A-Z、a-z、0-9 位数字,让我们看看设计是做什么的(link to github file):

def set_reset_password_token
  raw, enc = Devise.token_generator.generate(self.class, :reset_password_token)

  self.reset_password_token   = enc
  self.reset_password_sent_at = Time.now.utc
  save(validate: false)
  raw
end

什么 Devise.token_generator.generate (seen here) does is generate a raw token using SecureRandom.urlsafe_base64(rlength).tr('lIO0', 'sxyz') (of length 20, as seen here) 和 return 原始和加密令牌,除非某些用户已经分配了相同的令牌。

最后,您需要做的是使用 SecureRandom functions allied with tr 重写此 set_password_token 以按照您喜欢的方式生成令牌,并且不要忘记确保令牌是唯一的并且当前不是用过。