v1.0.3

設定

最後更新


所有設定都透過 goJwt.New(goJwt.Config{...}) 傳入,本函式庫不讀任何環境變數;金鑰相關設定見 金鑰管理。

Config


欄位型別JSON tag必要說明
RedisRedisredis是Redis 連線設定
File*Filefile否PEM 金鑰檔案路徑
Option*Optionparameter否Token 參數;nil 時全部套用預設值
Cookie*Cookiecookie否Cookie 屬性覆寫;nil 時使用預設屬性
CheckAuthfunc(Auth) (bool, error)不序列化否每次刷新時呼叫,回傳 false 或 error 即拒絕刷新(見 透明刷新)

Option 的 JSON tag 是 parameter,從 JSON 載入設定時要用這個鍵名。

Redis


欄位型別說明
Hoststring主機位址
Portint連接埠
Passwordstring密碼,可空
DBint資料庫編號

New() 以 Host:Port、Password 與 DB 建立 go-redis client 後執行 PING;PING 失敗時 New() 回傳 error。

Option


欄位型別預設值說明
PrivateKeystring—ECDSA 私鑰 PEM 內容
PublicKeystring—ECDSA 公鑰 PEM 內容
AccessTokenExpirestime.Duration15 * time.MinuteAccess Token 與 JTI 的有效期
RefreshIdExpirestime.Duration7 * 24 * time.HourRefresh ID 有效期
AccessTokenCookieKeystringaccess_tokenAccess Token Cookie 名稱
RefreshIdCookieKeystringrefresh_idRefresh ID Cookie 名稱,同時是 JWT 內存放 Refresh ID 的 claim 名稱
MaxVersionint5僅重簽次數上限,超過即整組重發
RefreshTTLfloat640.5Refresh ID 剩餘 TTL 低於 RefreshIdExpires × RefreshTTL 時整組重發

零值或負值一律回退至預設值。Verify() 以目前的 RefreshIdCookieKey 讀取 Refresh ID claim,且型別斷言未檢查;修改後,以舊名稱簽發且尚未過期的 Access Token 會在 Verify() 內 panic(gin.Default() 內建的 recovery 中介層回 500,純 net/http server 則中斷該請求)。請與金鑰輪替一起修改,或等以舊名稱簽發的 Access Token 全部過期後再修改。

欄位型別預設值
Domain*string未設定(僅限發出的主機)
Path*string/
SameSite*http.SameSitehttp.SameSiteLaxMode
Secure*boolfalse
HttpOnly*booltrue

只有非 nil 的欄位會覆寫預設值,套用於 access_token、refresh_id、conn.device.id 三個 Cookie。

完整範例


  1. package main
  2. import (
  3. "log"
  4. "net/http"
  5. "time"
  6. goJwt "github.com/pardnchiu/go-jwt/core"
  7. )
  8. func main() {
  9. domain := "example.com"
  10. secure := true
  11. sameSite := http.SameSiteStrictMode
  12. auth, err := goJwt.New(goJwt.Config{
  13. Redis: goJwt.Redis{Host: "redis.internal", Port: 6379, Password: "secret", DB: 1},
  14. File: &goJwt.File{
  15. PrivateKeyPath: "/etc/app/keys/private-key.pem",
  16. PublicKeyPath: "/etc/app/keys/public-key.pem",
  17. },
  18. Option: &goJwt.Option{
  19. AccessTokenExpires: 10 * time.Minute,
  20. RefreshIdExpires: 30 * 24 * time.Hour,
  21. MaxVersion: 10,
  22. RefreshTTL: 0.3,
  23. },
  24. Cookie: &goJwt.Cookie{
  25. Domain: &domain,
  26. Secure: &secure,
  27. SameSite: &sameSite,
  28. },
  29. })
  30. if err != nil {
  31. log.Fatalf("初始化 go-jwt 失敗: %v", err)
  32. }
  33. defer auth.Close()
  34. }

日誌


New() 將 package 層級的 slog logger 指向 syslog(priority LOG_INFO|LOG_LOCAL0、tag goCron、JSON 格式);syslog 無法連線時改輸出到 stderr(文字格式)。在 syslog 以 goCron tag 過濾即可找到 go-jwt 的紀錄。
EN