Day 15 - API 安全升級:JWT 登入驗證全流程實作
到目前為止,我們的 TodoList API 已經能跑起來,還能把資料存進資料庫。
但是,有沒有發現一個大漏洞?
👉 任何人都可以操作 todos,不需要登入!
但現在我們希望做到「一人一帳號,一人一份 TodoList」。
今天我們就來幫 API 加上 JWT 登入驗證,讓系統更有安全感 💪。
P.S 本次專案程式碼修改幅度較大,下面列出重點步驟,詳細可參考最下方補充資源的內容。
1. 先裝上兩大神器
要實作登入驗證,通常會用到這兩個套件:
- jsonwebtoken:產生與驗證 JWT(JSON Web Token),用來確認使用者身份。
- bcryptjs:幫密碼做雜湊(Hash),確保不會把明碼存進資料庫。
1 | npm install jsonwebtoken bcryptjs |
裝好之後,我們就能開始搞定 註冊 / 登入 / 驗證 middleware 了 🚀。
2. 新增 User 實體
我們需要一個使用者資料表,才能綁定 Todo。
1 | // src/entities/User.ts |
再來,把 Todo 也連上使用者:(可以覆蓋本來的 Todo.ts 程式碼)
1 | // src/entities/Todo.ts |
這樣一來,Todo 就會跟 User 綁定囉 。
3. 密碼加密工具
不建議把使用者輸入的密碼直接存進 DB。
所以我們先寫一個小工具來處理加密與比對:
1 | // src/utils/passwordUtils.ts |
4. JWT 工具
JWT 就像是使用者的「通行證」。
我們需要能夠 簽發 token 以及 驗證 token。
1 | // src/utils/jwtUtils.ts |
5. 註冊與登入流程
現在來寫 API:
1 | // src/controllers/authController.ts |
登入的流程則是比對密碼 → 發 token。
然後 routes 新增 authRoutes.ts
1 | // src/routes/authRoutes.ts |
.env 記得也要加上 JWT_SECRET
1 | JWT_SECRET=jwt_secret |
6. 認證中間件
有了 token 之後,還要能檢查它是否合法。
這時候就需要 middleware 出場啦:
1 | // src/middleware/isAuth.ts |
7. 保護 Todo API
最後,讓所有 Todo 操作都必須帶上 token 才能執行:
1 | // src/routes/todoRoutes.ts |
8.實作成果
用 postman 測試註冊 API :
測試登入 API :
在 postman 傳送請求時帶上 token
嘗試新增待辦事項
可發現待辦事項綁定了 userId
現在,每個人都只能操作自己的 Todo!🎉
🔑 本日重點複習
- bcryptjs:加密密碼,保護使用者資料。
- jsonwebtoken:簽發 / 驗證 Token,實現登入驗證。
- middleware:保護 API,只允許合法使用者操作。
- User 與 Todo 關聯:實現一人一份 TodoList。
寫在最後
做到這裡,我們的 TodoList API 已經升級到「多人系統」。
每個人都必須註冊 / 登入,才能建立屬於自己的 Todo。
補充資源
commit : install jwt plugin and implement auth feature