首页 > 解决方案 > 如何在rails api上重置密码?[不使用设计]

问题描述

所以我正在尝试为我的 rails api 恢复密码机制,但我碰壁了。

在做了一些研究之后,我想出了一个实现它的方法。它返回像它一样工作的值,但密码没有被重置,我不知道为什么。

我的用户表如下所示:

create_table "users", force: :cascade do |t|
    t.string "first_name"
    t.string "middle_name"
    t.string "last_name"
    t.string "username"
    t.string "email"
    t.string "password_digest"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
  end

我重置密码的方式是:从控制器:

...
def reset
        token = params[:token].to_s

        if params[:email].blank?
            return render json: {error: 'Token not present.'}
        end

        user = User.find_by(reset_password_token: token)

        if user.present? && user.password_token_valid?
            if user.reset_password!(params[:password])
                render json: {status: 'ok'}, status: :ok
            else
                render json: {error: user.errors.full_messages}, status: :unprocessable_entity
            end
        else
            render json: {error: 'Link not valid or expired.'}, status: :not_found
        end
    end
...

然后模型:

...

 def password_token_valid?
        (self.reset_password_sent_at + 4.hours) > Time.now.utc
    end

    def reset_password!(password)
        self.reset_password_token = nil
        self.password = password
    end
...

这是实现这一点的正确方法吗?这是实现此功能的最安全方法吗?

注意:我只在生产环境中测试过,这是由于我的开发环境限制发送电子邮件。

标签: ruby-on-railsauthentication

解决方案


您只是在更新内存中的值,而不是将它们持久化到数据库中。

def reset_password!(password)
  update!(
    password: password,
    reset_password_token: nil
  )
end

这是实现此功能的最安全方法吗?

不。重新发明身份验证轮是应用程序被黑客入侵的最常见原因之一。


推荐阅读