Rails5 API + devise_token_auth编辑令牌格式

时间:2018-09-04 14:36:17

标签: ruby-on-rails-5 rails-api reset-password devise-token-auth

所以我将devise_token_auth gem用于基本的用户功能,并且我对重置密码流程进行了一些简单的更改。我显示的是令牌,而不是电子邮件中的链接供用户单击并转到重置页面,而是显示令牌,因此用户必须复制令牌并在字段中手动输入。

它是这样工作的,但是令牌太大而又难看,我希望它是类似6个字母数字的数字。它看起来更好,并使用户更轻松。我不太清楚该怎么做,我可能应该覆盖一些设计好的原始控制器。怎么做?当devise_token_auth将控制器放置在每个原始devise控制器的“顶部”时,我想要的是从devise的可恢复模块中覆盖set_reset_password_token。

编辑:我自己找到了答案,所以我将在下面回答!但是请随意抱怨,提出并提出更好的/替代解决方案。

1 个答案:

答案 0 :(得分:0)

因此,首先,如果要覆盖来自devise模块的功能,则可以在模型文件中以相同的名称(可能在models / user.rb中)写入该功能。要覆盖可恢复模块中的set_reset_password,只需执行以下操作(如Sergio Tulentsev here的建议):

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位数字,仅包含AZ,az和0-9位数字,让我们看看设计的作用({ {3}}):

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.generatelink to github file)的工作是使用SecureRandom.urlsafe_base64(rlength).tr('lIO0', 'sxyz')(长度为20,seen here)来生成原始令牌,并返回原始令牌和加密令牌,除非已有一些用户使用分配了相同的令牌。

最后,您需要做的是使用as seen here关联的SecureRandom函数重写此set_password_token,以您喜欢的任何方式生成令牌,并且不要忘记确保令牌是唯一的而不是当前正在使用。