Rails5 API + devise_token_auth编辑令牌格式

问题描述 投票:0回答:1

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

它是这样工作的,但令牌是大而丑,我希望它像6个字母数字。它看起来更好,它使用户更容易。我不太清楚怎么做,我可能应该覆盖一些设计原始的Controller。怎么做?由于devise_token_auth将控制器置于每个原始设备控制器的“顶部”,我想要的是从设计的可恢复模块覆盖set_reset_password_token。

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

ruby-on-rails-5 rails-api reset-password devise-token-auth
1个回答
0
投票

因此,首先,如果要覆盖设计模块中的函数,可以在模型文件中使用相同的名称编写它,可能在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位数,只包含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.generateseen here)所做的是使用SecureRandom.urlsafe_base64(rlength).tr('lIO0', 'sxyz')(长度为20,as seen here)生成原始令牌并返回原始和加密令牌,除非某些用户已经分配了相同的令牌。

最后,您需要做的是使用与SecureRandom结合的tr函数重写此set_password_token,以您喜欢的方式生成标记,并且不要忘记确保标记是唯一的并且当前未被使用。

© www.soinside.com 2019 - 2024. All rights reserved.