架構
JWTAuth、中介層、PEM 載入與 Redis Token 生命週期的系統配置。
概覽
graph TB
REQ[HTTP 請求] --> MW[中介層]
MW --> V[Verify]
V -->|有效| AUTH[回傳 Auth]
V -->|過期| RF[Refresh]
V -->|無 Token| DENY[拒絕]
RF --> REDIS[(Redis)]
V --> FP[裝置指紋]
Module: JWTAuth
JWTAuth 是對外主入口,持有 Config、Redis client 與 ECDSA 金鑰。
graph TB
subgraph JWTAuth
New[New] --> PEM[handlePEM / parsePEM]
New --> Redis[Redis Client]
Create[Create] --> Sign[signJWT ES256]
Create --> Store[Redis Pipeline]
Verify[Verify] --> Parse[parseJWT]
Verify --> RevokeCheck[撤銷檢查]
Verify --> Refresh[refresh]
Refresh --> Lock[SetNX 分散鎖]
Refresh --> Sign
Revoke[Revoke] --> Clear[clearCookie + 撤銷鍵]
end
Client[呼叫端] --> New
Client --> Create
Client --> Verify
Client --> Revoke
RedisDB[(Redis)] --> Store
RedisDB --> RevokeCheck
RedisDB --> Lock
Module: Middleware
Gin 與 net/http 中介層包裝 Verify,成功後將 Auth 寫入 context。
graph LR
subgraph Middleware
Gin[GinMiddleware] --> Verify
HTTP[HTTPMiddleware] --> Verify
GetGin[GetAuthDataFromGinContext]
GetHTTP[GetAuthDataFromHTTPRequest]
end
Verify[Verify] --> Auth[Auth in context]
Module: PEM
金鑰載入優先序:檔案路徑 → 內嵌 PEM 字串 → 預設路徑自動產生 ECDSA P-256。
graph TB
Start[handlePEM] --> File{File 路徑?}
File -->|是| ReadFile[讀取 PEM 檔]
File -->|否| Inline{Option 內嵌?}
Inline -->|是| UseInline[使用字串]
Inline -->|否| Default{預設檔存在?}
Default -->|是| ReadDefault[讀取 ./keys]
Default -->|否| Create[createPEM P-256]
ReadFile --> Parse[parsePEM]
UseInline --> Parse
ReadDefault --> Parse
Create --> Parse
資料流
sequenceDiagram
participant C as Client
participant M as Middleware
participant V as Verify
participant R as Redis
participant P as PEM
C->>M: HTTP Request
M->>V: Verify(w, r)
V->>R: 檢查 revoke / jti
alt Token 有效
V->>P: parseJWT ES256
V-->>M: Auth
M-->>C: 放行 + context
else Token 過期
V->>R: SetNX 鎖 + getRefreshData
V->>P: signJWT
V->>R: 更新 refresh / jti
V-->>M: Auth + 新 Token
M-->>C: 放行
else 無 Token / 撤銷
V-->>M: Unauthorized
M-->>C: 401/錯誤 JSON
end
套件配置
| 路徑 | 角色 |
|---|---|
core/ |
函式庫套件 goJwt(import github.com/pardnchiu/go-jwt/core) |
core/instance.go |
New、Close、Option 預設值 |
core/create.go |
簽發 Access Token + Refresh ID |
core/verify.go |
解析、撤銷檢查、透明刷新 |
core/revoke.go |
登出/工作階段撤銷 |
core/middleware.go |
Gin 與 net/http 中介層 |
core/type.go |
Config、Auth、JWTAuthResult、Redis 鍵 |
core/pem.go |
PEM 載入/產生/解析 |