【问题标题】:Rails5 API + devise_token_auth edit token formatRails5 API + devise_token_auth 编辑令牌格式
【发布时间】:2019-02-09 15:06:43
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    所以,首先,如果你想从一个设计模块覆盖一个函数,你可以在你的模型文件上用相同的名字写它,可能在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 位数字,让我们看看 devise 做了什么(@ 987654323@):

    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) 所做的是使用 SecureRandom.urlsafe_base64(rlength).tr('lIO0', 'sxyz')(长度为 20,as seen here)生成原始令牌并返回原始和加密令牌,除非某些用户已经分配了相同的令牌。

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

    【讨论】:

      猜你喜欢
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多