Go 語言系列(九):使用者認證
這是 Go 語言從零到 Web 應用系列的第九篇。上一篇我們整合了資料庫,這篇要加入使用者認證,讓 API 知道「誰」在操作。 認證的基本概念 Authentication vs Authorization Authentication(認證):驗證「你是誰」——使用者登入 Authorization(授權):驗證「你能做什麼」——權限檢查 這篇聚焦在 Authentication。 JWT 認證流程 我們採用 JWT(JSON Web Token)認證方式: 1. 使用者註冊 → 密碼用 bcrypt 雜湊後存入資料庫 2. 使用者登入 → 驗證密碼 → 回傳 JWT Token 3. 後續請求 → 在 Header 帶上 Token → 中間件驗證 → 存取受保護資源 安裝依賴 go get golang.org/x/crypto/bcrypt go get github.com/golang-jwt/jwt/v5 bcrypt:密碼雜湊演算法 golang-jwt:Go 社群最廣泛使用的 JWT 套件 使用者模型 internal/model/user.go package model import "time" type User struct { ID int `json:"id"` Username string `json:"username"` Email string `json:"email"` PasswordHash string `json:"-"` // json:"-" 永遠不會出現在 JSON 回應中 CreatedAt time.Time `json:"created_at"` } type RegisterRequest struct { Username string `json:"username"` Email string `json:"email"` Password string `json:"password"` } func (r RegisterRequest) Validate() map[string]string { errs := make(map[string]string) if r.Username == "" { errs["username"] = "username is required" } if r.Email == "" { errs["email"] = "email is required" } if len(r.Password) < 8 { errs["password"] = "password must be at least 8 characters" } return errs } type LoginRequest struct { Email string `json:"email"` Password string `json:"password"` } type AuthResponse struct { Token string `json:"token"` User User `json:"user"` } 注意 PasswordHash 的 json:"-" 標籤——這確保密碼雜湊永遠不會被序列化到 JSON 回應中。 ...