[golang]在 Golang 中,可以使用 JWT (JSON Web Token) 來進行身份驗證

在 Golang 中,可以使用 JWT (JSON Web Token) 來進行身份驗證。常見的做法是:

  1. 登入時,根據使用者資訊產生 JWT Token 並回傳給前端。
  2. 每次請求 API,前端將 Token 放入 Authorization 標頭,後端驗證 JWT 是否有效。
  3. 後端解析 JWT,確認是否有效,並取得使用者資訊。


1. 安裝 JWT 套件

go get github.com/golang-jwt/jwt/v5


2. 產生 JWT Token

當使用者登入成功後,產生一個 JWT Token,並回傳給前端:

package main import ( "fmt" "time" "github.com/golang-jwt/jwt/v5" ) // 設定 JWT 秘密金鑰 var jwtKey = []byte("my_secret_key") // Token Payload 結構 type Claims struct { Username string `json:"username"` jwt.RegisteredClaims } // 產生 JWT Token func GenerateJWT(username string) (string, error) { expirationTime := time.Now().Add(24 * time.Hour) // 設定過期時間 (24 小時) claims := &Claims{ Username: username, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(expirationTime), }, } // 產生 Token token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) // 簽名 Token tokenString, err := token.SignedString(jwtKey) if err != nil { return "", err } return tokenString, nil } func main() { token, err := GenerateJWT("user123") if err != nil { fmt.Println("產生 JWT 失敗:", err) return } fmt.Println("JWT Token:", token) }


3. 驗證 JWT Token

後端 API 需要驗證 Authorization Header 的 JWT 是否有效:

package main import ( "fmt" "net/http" "strings" "github.com/golang-jwt/jwt/v5" ) // 驗證 JWT Token func ValidateJWT(tokenString string) (*Claims, error) { claims := &Claims{} token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) { return jwtKey, nil }) if err != nil || !token.Valid { return nil, fmt.Errorf("無效的 Token") } return claims, nil } // Middleware:驗證 JWT func JWTMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { authHeader := r.Header.Get("Authorization") if authHeader == "" { http.Error(w, "未提供 Token", http.StatusUnauthorized) return } // 解析 Token tokenParts := strings.Split(authHeader, " ") if len(tokenParts) != 2 || tokenParts[0] != "Bearer" { http.Error(w, "Token 格式錯誤", http.StatusUnauthorized) return } claims, err := ValidateJWT(tokenParts[1]) if err != nil { http.Error(w, "Token 驗證失敗", http.StatusUnauthorized) return } // Token 有效,繼續處理請求 fmt.Printf("驗證成功,使用者: %s\n", claims.Username) next.ServeHTTP(w, r) }) } // 測試 API func protectedHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "這是一個受保護的 API") } func main() { mux := http.NewServeMux() mux.Handle("/protected", JWTMiddleware(http.HandlerFunc(protectedHandler))) fmt.Println("伺服器啟動於 http://localhost:8080") http.ListenAndServe(":8080", mux) }


4. 測試 API

取得 JWT Token

先執行 GenerateJWT("user123"),會得到一個 JWT Token

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

使用 JWT 呼叫受保護 API

curl -X GET http://localhost:8080/protected \
-H "Authorization: Bearer <你的 JWT Token>"

如果 JWT 正確,會回應:

這是一個受保護的 API

如果 JWT 無效,會回應:

HTTP/1.1 401 Unauthorized 無效的 Token


總結


✅ 登入時產生 JWT,回傳給前端
✅ 前端每次請求時,在 Authorization Header 帶上 JWT
✅ 後端 Middleware 解析 JWT,驗證使用者身份




留言

這個網誌中的熱門文章

[Kotlin]如何學習Kotlin

[golang]如何使用 gorm 高效執行批量插入 (可以透過 Create()、CreateInBatches(),或者 原生 SQL 語句 來提升效率)

[Kotlin]Kotlin Multiplatform (KMP) 如何安裝使用和部署