问题描述
我正在使用Devise构建应用程序。 我遇到的问题与密码重置过程有关。
如果用户忘记了密码,请输入注册的电子邮件地址,并向该地址发送密码重置通知。 到目前为止,它可以按预期运行。
问题
电子邮件中收到的密码重置令牌与应用程序生成的密码重置令牌不匹配。 因此,当我尝试从收到的电子邮件中重置密码时,出现错误“令牌无效”。
========================
显示我的代码。
宝石文件
gem 'devise'
gem 'omniauth'
gem 'omniauth-google-oauth2'
gem 'omniauth-facebook'
gem 'devise-i18n'
routes.rb
devise_for :users,controllers: {
registrations: 'users/registrations',sessions: 'users/sessions',confirmations: 'users/confirmations',omniauth_callbacks: 'users/omniauth_callbacks'
}
model / user.rb
devise :database_authenticatable,:registerable,:recoverable,:rememberable,:validatable,:confirmable,:omniauthable,omniauth_providers: %i[google_oauth2]
def self.from_omniauth(auth)
where(provider: auth.provider,uid: auth.uid).first_or_create do |user|
user.email = auth.info.email
user.password = Devise.friendly_token[0,20]
user.skip_confirmation!
end
end
def update_without_current_password(params,*options)
params.delete(:current_password)
if params[:password].blank? && params[:password_confirmation].blank?
params.delete(:password)
params.delete(:password_confirmation)
end
result = update_attributes(params,*options)
clean_up_passwords
result
end
views / users / mailer / reset_password_instructions.html.erb
<%= link_to 'パスワードの変更を行う',edit_password_url(@resource,reset_password_token: @token) %>
======================================
我搜索了很多次,但是找不到太多新信息,因为它只是旧信息。
为什么令牌不匹配? 如何通过电子邮件发送生成的令牌? 请帮助某人。
※我英语不好。可能有错误。
解决方法
您必须为重置令牌创建一个新表。
模式可以像
),you can pass each text element to
每当用户要请求更改密码时。在此password_reset_tokens中创建一个带有随机reset_token字符串的条目,并为其分配一个user_id。 在带有链接的电子邮件中发送此令牌,当用户单击它时,将重置令牌。打开带有新密码字段的表单,并在通过该链接更新密码后,将is_active标记为false。
其他步骤:
您还可以编写一个cron来使x小时后的reset_tokens失效。每当生成新的reset_passsword_token时,您都可以安排cron在x小时后过期。