來到比賽最後一天了,雖然很想直接以整理、感想建議或未來規劃等議題來總結競賽,但還是盡可能地保持學習的初心,以學習開發不同的功能來開啟今天的篇章,今天我想分享的是:密碼重設功能。
今天說明完這次賽期的最後一個功能後,想來回顧這30天的學習內容,檢討一下目前已開發的功能還有哪裡可以改進。最後提出幾點的建議給未來參賽的自己或讀到這篇文章的各位。
這邊指的密碼重設功能,就是我們常在網頁上看到的「忘記密碼」背後做的事情,回想一下我們如果忘記登入密碼,點擊忘記密碼按鈕或連結後,應用程式引導我們做的其實就是重設密碼這件事。
為什麼選擇在今天才開發忘記密碼?因為忘記密碼後應用程式通常會寄送帶有驗證效果的 Email 給使用者,當使用者點擊 Email 中的連結,會被導向應用程式的頁面重新設定密碼。
是不是很耳熟?其實就跟我們昨天完成的帳號註冊驗證 Email 功能有87%像 (?)
因為此功能實作概念大致上與昨天相同,今天就以流程圖說明為主,就不再放上實作的細節,過幾天整理好程式碼後,會在此補上 github 連結!

整個過程跟註冊帳號時的 Email 驗證流程很類似,也是在使用者提出重設密碼的請求後,產生帶有效期性的 token,並將 token 帶在 Url 中寄送至使用者的信箱。在使用者點擊連結後,導向該頁面之元件負責取得 Token 到後端驗證。
當中些微的差別就在於:
(1) 使用者需要先提供當初註冊的 Email,此處要注意若 Email 不存在也不應透漏太多資訊(跟登入一樣),避免帳號的註冊狀態被惡意人士查詢。
(2) 密碼與 token 會在重設密碼的請求中一起帶給後端,也要記得一樣要將密碼加密後再存入資料庫。
30天鐵人賽終於到了尾聲,本來有點猶豫要不要寫賽後感言,但是遙想當初參加競賽前,也有看過前輩們分享競賽心得,多少得到一些啟發,最後還是決定附上一小篇賽後檢討,將我認為的賽前可以注意或準備的事項記錄下來,致未來參賽的自己或各位:
雖然很久之前就有參賽打算,也有被前輩提醒,但還是拖到前幾周才開始構想整個專案的架構,與 30 天內容分配。
要提醒跟我一樣首次參賽的朋友提前準備好內容,才不會痛苦感太重,或甚至為了趕稿,無法好好靜下心學習、匆匆地寫出品質沒那麼好的內容。
本次競賽前訂下的目標為:完成後端開發,但實際上僅完成身分驗證相關服務。造成目標與成果間的落差除了未提早準備外,也因為首次參賽而沒有好好的評估自身的能力所及。
因此提醒新手工程師參賽時盡量不要像我一樣好高騖遠 XD ,衡量自身能力並訂定一個可以完成的目標,比較不會感覺挫折。再者,盡量準確的評估工時進度也是工作上重要的能力之一。
會提出這點是因為,當初認為參加 Side Project 30 這個主題應該要逐步記錄自己的每個環節程式碼做了那些改動,但越到後面越覺得一個功能連帶要修正的地方很多,尤其從引入前端介面的開發開始,發現整篇文章很難聚焦在某個重點上。
再者,常常我們參考相關的文章時都不是從頭開始看,如果 30 天文章關聯性太高(就像我每次的改動就是基於先前開發的程式碼開始說明),會讓不是從第一天開始看的讀者看得一頭霧水,或說明太多不必要的細節。
未來如果再次參賽,會嘗試將每個主題寫得更像一篇獨立、以 MVP 為導向的說明。
雖然當初為這次主題命名為「吃出一個side project!」是想把整個專案的後端完成,讓美食系統的功能有個雛形,結果至今只幾乎完成了授權與驗證相關的微服務 …哈哈。
不過慢雖慢,感覺自己這 30 天學習得很扎實,實作了很多先前只是聽過的功能,稍微 Recap 一下這 30 天內我們碰到過哪些功能:
UserDetails, AuthenticationManager 與 PasswordEncoder。spring-boot-starter-mail,實作了帳號 Email 驗證與密碼重設的功能。順便也提出幾個 AuthService 未來可改進的方向:
HttpOnly Cookie。來不及在這次開發的部分(後端的服務、前端介面、雲端部署)則留待未來章節再進行補充。雖然之後不會日更,但也希望持續將開發的筆記記錄在此,完成當初的目標。
30 天鐵人賽的內容至此,未來會持續不定時更新開發筆記。
最後感謝看過文章與給予回饋和支援的所有人,祝福各位在學習的路上碩果累累,一帆風順:)