架構
最後更新
本頁以一張圖說明 @pardnchiu/jwt-auth 的組成層級與外部相依。
系統概覽
graph TB
Client[客戶端] -->|Cookie / Bearer / X-Refresh-ID / X-Device-ID| Route[Express 路由]
Route --> Auth[JWTAuth static 類別]
Auth --> FP[CreateFingerprint]
Auth --> RID[CreateRefreshId]
Auth --> JWT[jsonwebtoken ES256]
Auth --> Redis[(Redis refresh: / revoke:)]
Auth --> Check[checkUserExists 回呼]
Auth -->|Set-Cookie / X-New-*| Client
分層
| 層 | 檔案 | 職責 |
|---|---|---|
| 公開 API | src/JWTAuth.ts |
init、close、CreateJWT、VerifyJWT、RevokeJWT、GetAuth;以 static 欄位保存設定與 Redis 連線 |
| 指紋 | src/CreateFingerprint.ts |
由 User-Agent 與 Device ID 產生 SHA-256 指紋 |
| Refresh ID | src/CreateRefreshId.ts |
createRefreshId() 由使用者資料、指紋與簽發時間產生 SHA-256 識別碼 |
| 型別 | src/type.ts |
Config、AuthData、VerifyResult 等介面 |
| 匯出 | src/index.ts |
具名與預設匯出 JWTAuth,並匯出全部型別 |
跨切原則
| 原則 | 實作 |
|---|---|
| 單一行程狀態 | JWTAuth 不可實例化,同一行程只有一組設定與一條 Redis 連線 |
| 伺服器端狀態只放 Redis | Refresh 資料與撤銷黑名單皆為帶 TTL 的 Redis 鍵,過期自動清除 |
| Token 綁定裝置 | Access Token 與 Refresh 資料都存有指紋,每次驗證比對 |
| 驗證不拋錯 | VerifyJWT 只有在未初始化時拋出,其餘失敗皆轉為 VerifyResult |
延伸閱讀
- 模組圖、時序圖與狀態機完整版:doc/architecture.zh.md
- 續期流程:Refresh Token 輪替