[英]How to implement “forgot/reset password” feature properly in Node.js? (Using one time token)
我正在使用 NestJs 在 Node.js 應用程序中實現忘記/重置密碼功能。
這是一般流程:
example.com/reset/generated_jwt_token
)example.com/reset/generated_jwt_token
)這種方法的主要問題是 jwt 令牌可以無限次使用來重置密碼(直到它在 X 分鍾后過期)。
有沒有辦法解決這個問題? 有人說將當前密碼的 hash 作為有效載荷,因為無論如何它都會被更改並保證使用 1 次,但我不喜歡這種方法。
編輯:我遇到的另一種方法是在 jwt 令牌的數據庫中創建一個不能多次使用的黑名單集合。 或者以同樣的方式在 redis 中使用緩存,但似乎擴展性不是很好。
生成令牌后,您可以將其(或嵌入其中的唯一內容)保存到該用戶名下的數據庫中。 然后,服務器驗證令牌:
(1)當點擊來自reset email的鏈接時
(2)當用戶提交重置密碼頁面時
通過檢查令牌是否與數據庫中該用戶的令牌相同。
此外,當用戶成功更改密碼時,請從數據庫中清除令牌,使其無法再次使用。
我同意@CertainPerformance 的(已接受)答案。
我想補充一下 - 考慮使用authentication-flows-js 。 您根本不必擔心實施!
它是一個可以回答大多數流程的模塊 - 身份驗證、注冊、忘記密碼、更改密碼等,並且它足夠安全,因此應用程序可以使用它,而不必擔心它會很容易被黑客入侵。
從我寫的一篇文章中:
忘記密碼
用戶在忘記密碼表單中輸入他們的 email,然后點擊提交。 服務器 (AFM) 驗證帳戶是否存在且未被鎖定。 如果它被鎖定,AFM 會拋出錯誤。 否則,將使用令牌向用戶發送 email。 該令牌存儲在數據庫中用戶的同一行/文檔/記錄中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.