ruby-on-rails - 如何在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
...
这是实现这一点的正确方法吗?这是实现此功能的最安全方法吗?
注意:我只在生产环境中测试过,这是由于我的开发环境限制发送电子邮件。
解决方案
您只是在更新内存中的值,而不是将它们持久化到数据库中。
def reset_password!(password)
update!(
password: password,
reset_password_token: nil
)
end
这是实现此功能的最安全方法吗?
不。重新发明身份验证轮是应用程序被黑客入侵的最常见原因之一。
推荐阅读
- python - 在不知道其公式的情况下,在python中提取并绘制曲线的一阶导数?
- reactjs - 如何在自动完成材质 UI 中呈现自定义 jsx 元素
- python - Django 静态视频无法在 Chrome 或 Edge 上播放
- android - Kotlin 1.5.20 打破了 dagger/moshi 的 kapt
- c++ - spidev ioctl 返回无效参数错误
- azure - 在 Azure DevOps 参数化中使用 assignable_scope 构建 azurerm_role_definition
- postgresql - postgres 选择 nextval 会导致一些性能问题吗?
- go - flag.Args()后如何访问
- django-models - 如何计算月份有可用位置的不同imei
- c - 将 void* 复制到数组中的某个位置,C