iT邦幫忙

2025 iThome 鐵人賽

DAY 30
0
佛心分享-SideProject30

吃出一個SideProject!系列 第 30

Day 30:密碼重設功能說明 & 30 天賽後總結

  • 分享至 

  • xImage
  •  

來到比賽最後一天了,雖然很想直接以整理、感想建議或未來規劃等議題來總結競賽,但還是盡可能地保持學習的初心,以學習開發不同的功能來開啟今天的篇章,今天我想分享的是:密碼重設功能。

今天說明完這次賽期的最後一個功能後,想來回顧這30天的學習內容,檢討一下目前已開發的功能還有哪裡可以改進。最後提出幾點的建議給未來參賽的自己或讀到這篇文章的各位。

密碼重設功能說明

這邊指的密碼重設功能,就是我們常在網頁上看到的「忘記密碼」背後做的事情,回想一下我們如果忘記登入密碼,點擊忘記密碼按鈕或連結後,應用程式引導我們做的其實就是重設密碼這件事。

為什麼選擇在今天才開發忘記密碼?因為忘記密碼後應用程式通常會寄送帶有驗證效果的 Email 給使用者,當使用者點擊 Email 中的連結,會被導向應用程式的頁面重新設定密碼。

是不是很耳熟?其實就跟我們昨天完成的帳號註冊驗證 Email 功能有87%像 (?)

因為此功能實作概念大致上與昨天相同,今天就以流程圖說明為主,就不再放上實作的細節,過幾天整理好程式碼後,會在此補上 github 連結!

忘記密碼、重設密碼流程

https://ithelp.ithome.com.tw/upload/images/20251014/20178099lkENuybFrW.png

整個過程跟註冊帳號時的 Email 驗證流程很類似,也是在使用者提出重設密碼的請求後,產生帶有效期性的 token,並將 token 帶在 Url 中寄送至使用者的信箱。在使用者點擊連結後,導向該頁面之元件負責取得 Token 到後端驗證。

當中些微的差別就在於:

(1) 使用者需要先提供當初註冊的 Email,此處要注意若 Email 不存在也不應透漏太多資訊(跟登入一樣),避免帳號的註冊狀態被惡意人士查詢。

(2) 密碼與 token 會在重設密碼的請求中一起帶給後端,也要記得一樣要將密碼加密後再存入資料庫。

賽後感想

30天鐵人賽終於到了尾聲,本來有點猶豫要不要寫賽後感言,但是遙想當初參加競賽前,也有看過前輩們分享競賽心得,多少得到一些啟發,最後還是決定附上一小篇賽後檢討,將我認為的賽前可以注意或準備的事項記錄下來,致未來參賽的自己或各位:

提前準備

雖然很久之前就有參賽打算,也有被前輩提醒,但還是拖到前幾周才開始構想整個專案的架構,與 30 天內容分配。

要提醒跟我一樣首次參賽的朋友提前準備好內容,才不會痛苦感太重,或甚至為了趕稿,無法好好靜下心學習、匆匆地寫出品質沒那麼好的內容。

量力而為

本次競賽前訂下的目標為:完成後端開發,但實際上僅完成身分驗證相關服務。造成目標與成果間的落差除了未提早準備外,也因為首次參賽而沒有好好的評估自身的能力所及。

因此提醒新手工程師參賽時盡量不要像我一樣好高騖遠 XD ,衡量自身能力並訂定一個可以完成的目標,比較不會感覺挫折。再者,盡量準確的評估工時進度也是工作上重要的能力之一。

降低文章關聯性

會提出這點是因為,當初認為參加 Side Project 30 這個主題應該要逐步記錄自己的每個環節程式碼做了那些改動,但越到後面越覺得一個功能連帶要修正的地方很多,尤其從引入前端介面的開發開始,發現整篇文章很難聚焦在某個重點上。

再者,常常我們參考相關的文章時都不是從頭開始看,如果 30 天文章關聯性太高(就像我每次的改動就是基於先前開發的程式碼開始說明),會讓不是從第一天開始看的讀者看得一頭霧水,或說明太多不必要的細節。

未來如果再次參賽,會嘗試將每個主題寫得更像一篇獨立、以 MVP 為導向的說明。

未來方向

雖然當初為這次主題命名為「吃出一個side project!」是想把整個專案的後端完成,讓美食系統的功能有個雛形,結果至今只幾乎完成了授權與驗證相關的微服務 …哈哈。

不過慢雖慢,感覺自己這 30 天學習得很扎實,實作了很多先前只是聽過的功能,稍微 Recap 一下這 30 天內我們碰到過哪些功能:

  • 專案規劃與建置:規劃了專案藍圖、設定了多模組的 Maven 專案,學習如何透過 Docker 建立開發環境。
  • 本地身份驗證:實作了註冊與登入 API,理解 Spring Security 的核心元件在這方面的功能,如 UserDetails, AuthenticationManagerPasswordEncoder
  • JWT 權杖機制:探討了什麼是 JWT ,也學會了如何使用函式庫簽發 JWT,更建立了自訂的 Filter 來自訂驗證流程。
  • token 生命週期管理:為了兼顧安全性與使用者體驗,實作了 Refresh Token 機制,以及簡單的登出功能。
  • 第三方登入:從理論層面了解 OAuth 2.0 與 OIDC,並在使用框架(Spring Security OAuth2 Client)與不使用框架的兩種情況下,實作 Google 帳號登入的功能來進行比較。
  • Email 驗證:結合 spring-boot-starter-mail,實作了帳號 Email 驗證與密碼重設的功能。

順便也提出幾個 AuthService 未來可改進的方向:

  • 整合更多第三方登入:加入 Line 或 Facebook 登入。
  • 更細緻的權限管理:待其他服務主要的功能開發完畢,引入其他角色進行更細緻的權限控管。
  • 安全性強化:將 Refresh Token 的儲存方式,從目前的 Response Body 重構為更安全的 HttpOnly Cookie。
  • 完整的測試覆蓋:原則上開發完一個功能就應該要進行單元測試,為了盡量在賽期完成這個服務大部分的功能,我們暫時跳過了。所以未來為所有的 Service 和 Controller 撰寫單元測試與整合測試也是我們的目標之一。

來不及在這次開發的部分(後端的服務、前端介面、雲端部署)則留待未來章節再進行補充。雖然之後不會日更,但也希望持續將開發的筆記記錄在此,完成當初的目標。


30 天鐵人賽的內容至此,未來會持續不定時更新開發筆記。

最後感謝看過文章與給予回饋和支援的所有人,祝福各位在學習的路上碩果累累,一帆風順:)


上一篇
Day 29:實作註冊帳號 Email 驗證功能 (2)
系列文
吃出一個SideProject!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言