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 以按照您喜欢的方式生成令牌,并且不要忘记确保令牌是唯一的并且当前不是用过。
所以我使用 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 以按照您喜欢的方式生成令牌,并且不要忘记确保令牌是唯一的并且当前不是用过。