v1.0.3

快速開始

最後更新


本頁從安裝到跑起第一個受保護路由:啟動 Redis、建立 JWTAuth、登入、存取、登出。

前置需求


項目版本
Go1.24 以上(go.mod 宣告 go 1.24.3)
Redis任一支援 SETEX/SETNX/EVAL/MULTI 的版本(CI 使用 redis:7-alpine)
Gin僅在使用 GinMiddleware() 時需要

安裝


  1. go get github.com/pardnchiu/go-jwt@latest

套件位於 core/ 子目錄,package 名稱為 goJwt。v1.0.3 起匯入路徑為 github.com/pardnchiu/go-jwt/core,舊路徑的符號對照見 已移除 API。
  1. import goJwt "github.com/pardnchiu/go-jwt/core"

啟動 Redis


  1. docker run -d --name redis -p 6379:6379 redis:7-alpine

第一個伺服器


  1. package main
  2. import (
  3. "encoding/json"
  4. "log"
  5. "net/http"
  6. goJwt "github.com/pardnchiu/go-jwt/core"
  7. )
  8. func main() {
  9. auth, err := goJwt.New(goJwt.Config{
  10. Redis: goJwt.Redis{Host: "localhost", Port: 6379},
  11. })
  12. if err != nil {
  13. log.Fatalf("初始化 go-jwt 失敗: %v", err)
  14. }
  15. defer auth.Close()
  16. mux := http.NewServeMux()
  17. mux.HandleFunc("POST /login", func(w http.ResponseWriter, r *http.Request) {
  18. result := auth.Create(w, r, &goJwt.Auth{ID: "u_001", Name: "Pardn", Email: "dev@example.com"})
  19. if !result.Success {
  20. http.Error(w, result.Error, result.StatusCode)
  21. return
  22. }
  23. w.Header().Set("Content-Type", "application/json")
  24. json.NewEncoder(w).Encode(result.Token)
  25. })
  26. mux.Handle("GET /me", auth.HTTPMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  27. user, ok := goJwt.GetAuthDataFromHTTPRequest(r)
  28. if !ok {
  29. http.Error(w, "unauthorized", http.StatusUnauthorized)
  30. return
  31. }
  32. w.Header().Set("Content-Type", "application/json")
  33. json.NewEncoder(w).Encode(user)
  34. })))
  35. mux.HandleFunc("POST /logout", func(w http.ResponseWriter, r *http.Request) {
  36. result := auth.Revoke(w, r)
  37. if !result.Success {
  38. http.Error(w, result.Error, result.StatusCode)
  39. return
  40. }
  41. w.WriteHeader(http.StatusNoContent)
  42. })
  43. log.Fatal(http.ListenAndServe(":8080", mux))
  44. }

第一次啟動時,若沒有設定金鑰且 ./keys/ 下沒有 PEM 檔,New() 會產生一組 P-256 金鑰對寫入 ./keys/private-key.pem 與 ./keys/public-key.pem(相對於工作目錄)。細節見 金鑰管理。

驗證流程


用 cookie jar 模擬瀏覽器。User-Agent 必須是可辨識的瀏覽器字串,或改帶固定的 X-Device-FP,否則指紋每次請求都不同(見 裝置指紋):
  1. UA="Mozilla/5.0 (Macintosh; Intel Mac OS X 14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120 Safari/537.36"
  2. # 登入:回應寫入 access_token、refresh_id、conn.device.id 三個 Cookie
  3. curl -s -A "$UA" -c jar.txt -b jar.txt -X POST http://localhost:8080/login
  4. # 存取受保護路由
  5. curl -s -A "$UA" -c jar.txt -b jar.txt http://localhost:8080/me
  6. # 登出:清除 Cookie 並撤銷 Access Token
  7. curl -s -A "$UA" -c jar.txt -b jar.txt -X POST http://localhost:8080/logout -o /dev/null -w "%{http_code}\n"

下一步


想做的事頁面
了解 Access Token、Refresh ID、JTI 的分工Token 模型
調整有效期、Cookie 屬性設定
接 Gin中介層
接行動 App 或 API 客戶端客戶端整合
EN