Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 重置设备中的密码令牌不匹配问题_Ruby On Rails_Devise_Token_Reset - Fatal编程技术网

Ruby on rails 重置设备中的密码令牌不匹配问题

Ruby on rails 重置设备中的密码令牌不匹配问题,ruby-on-rails,devise,token,reset,Ruby On Rails,Devise,Token,Reset,我正在使用Desive构建一个应用程序。 我遇到的问题是关于密码重置过程 如果用户忘记了密码,请输入注册的电子邮件地址并向该地址发送密码重置通知。 到目前为止,它的工作如预期 问题 电子邮件中接收到的密码重置令牌与应用程序生成的密码重置令牌不匹配。 因此,当我试图从收到的电子邮件中重置密码时,会出现错误“Token is invalid” ============== 显示我的代码 Gemfile gem 'devise' gem 'omniauth' gem 'omniauth-google-

我正在使用Desive构建一个应用程序。 我遇到的问题是关于密码重置过程

如果用户忘记了密码,请输入注册的电子邮件地址并向该地址发送密码重置通知。 到目前为止,它的工作如预期

问题

电子邮件中接收到的密码重置令牌与应用程序生成的密码重置令牌不匹配。 因此,当我试图从收到的电子邮件中重置密码时,会出现错误“Token is invalid”

==============

显示我的代码

Gemfile

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) %>

=========================================

我搜索了很多次,但我找不到多少新信息,因为这只是旧信息

为什么令牌不匹配? 如何通过电子邮件发送生成的令牌? 请帮助某人


※我的英语不好。可能有错误。

您必须为重置令牌创建一个新表

模式可以是

password_reset_tokens
---------------------
id pk
reset_token unique string
user_id integer
is_active boolean
created_at datetime
updated_at datetime
每当用户要请求更改密码时。使用随机重置令牌字符串在此密码重置令牌中创建一个条目,并为其分配一个用户id。 通过链接在电子邮件中发送此令牌,当用户要单击它时,重置令牌。使用新密码字段打开表单,当通过该链接更新密码时,则标记为false

附加步骤:


您还可以编写一个cron,使reset_令牌在x小时后过期。每当生成一个新的重置令牌时,您可以安排一个cron在x小时后过期。

很抱歉,缺少信息。我已经有一个t.string“reset\u password\u token”的模式,我需要创建一个新的模式吗?