簡體   English   中英

如何在 Node.js 中正確實現“忘記/重置密碼”功能? (使用一次性令牌)

[英]How to implement “forgot/reset password” feature properly in Node.js? (Using one time token)

我正在使用 NestJs 在 Node.js 應用程序中實現忘記/重置密碼功能。

這是一般流程:

  1. 用戶在“忘記密碼”表單中輸入他的 email 並提交請求
  2. 服務器生成一個 jwt 令牌,以用戶 ID 作為有效負載,然后發送一個 email 以該令牌作為重置密碼的鏈接(例如:GET: example.com/reset/generated_jwt_token
  3. 用戶從他的 email 中點擊鏈接,顯示重置密碼頁面,他用新密碼填寫表單並以密碼作為正文提交表單(例如:POST: example.com/reset/generated_jwt_token
  4. 服務器驗證令牌(未過期+來自有效負載的用戶 ID 存在於數據庫中)並更新密碼。

這種方法的主要問題是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM