![](/img/trans.png)
[英]How to get reset_password working with rails-api app using devise_auth_token gem
[英]How to reset password on rails api? [Not using devise]
所以我正在嘗試為我的 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
這是最安全的實現方式嗎?
不。重新發明身份驗證輪是應用程序被黑客入侵的最常見原因之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.