代码之家  ›  专栏  ›  技术社区  ›  lilux_m

无法识别自定义生成的重置密码令牌

  •  0
  • lilux_m  · 技术社区  · 7 年前

    我有一个rails应用程序,超级管理员可以在其中手动创建新用户。我需要向新用户发送一封电子邮件,以允许重置他的密码并连接到他的共享空间。

    因此,我尝试使用reset\u password\u令牌手动生成un-edit\u user\u password\u路径,并将其发送到用户的电子邮件中:

    def create
      raw, reset_password_token = Devise.token_generator.generate(
        User, :reset_password_token
      )
      @user = User.new(user_params)
      @user.reset_password_token = reset_password_token
      @user.reset_password_sent_at = Time.now.utc
    
      reset_password_url = Rails.configuration.endpoints['front'].to_s + Rails.application.routes.url_helpers.edit_user_password_path(reset_password_token: reset_password_token)
      # it generates http://localhost:3000/users/password/edit?reset_password_token=my_token_sent_by_email link, so it's good
    
      if @user.save(validate: false)
        AdminMailer.welcome_email(@user, reset_password_url).deliver
        render 'index'
      else
        render 'new'
      end
    end
    

    My user\u params方法是私有方法:

    def user_params
      params.require(:user).permit(:name, :email, :role)
    end
    

    但是,当我遵循生成的edit\u password\u链接并尝试重置密码时,我遇到了来自Desive的token\u invalid错误。

    当我尝试在Rails控制台中执行此操作时:

    User.find_by(reset_password_token, my_token_sent_by_email) 
    

    我从数据库中找到了记录。

    但是,当我为希望使用Desive的send\u reset\u password\u指令更改其密码的用户初始化重置密码链接时,它可以正常工作:

    def send_pass
      @user = User.find(params[:id])
      @user.send_reset_password_instructions
      redirect_back(fallback_location: root_path)
    end
    

    谁能解释一下我犯了什么错误吗? 谢谢你的回答

    1 回复  |  直到 7 年前
        1
  •  0
  •   lilux_m    7 年前

    所以,我终于找到了解决方案。

    当我们生成令牌时

    raw, reset_password_token = Devise.token_generator.generate(User, :reset_password_token)
    

    我们需要将reset\u password\u令牌保存在数据库中(使用corse的reset\u password\u sent\u,但我们需要在edit\u password\u链接中发送raw:

    reset_password_url = Rails.configuration.endpoints['front'].to_s + Rails.application.routes.url_helpers.edit_user_password_path(reset_password_token: raw)