# 設定

本頁列出 `JWTAuth.init()` 接收的 `Config` 每個欄位、預設值與驗證規則。

## 欄位

| 欄位 | 型別 | 必要 | 預設值 | 說明 |
|---|---|---|---|---|
| `privateKeyPath` | `string` | 二擇一 | — | 私鑰檔案路徑；有設定時覆蓋 `privateKey` |
| `privateKey` | `string` | 二擇一 | — | 私鑰 PEM 內容 |
| `publicKeyPath` | `string` | 二擇一 | — | 公鑰檔案路徑；有設定時覆蓋 `publicKey` |
| `publicKey` | `string` | 二擇一 | — | 公鑰 PEM 內容 |
| `accessTokenExpires` | `number` | 是 | — | Access Token 壽命（秒）；同時是撤銷黑名單 TTL |
| `refreshTokenExpires` | `number` | 是 | — | Refresh ID 壽命（秒），每次續期重設 |
| `isProd` | `boolean` | 是 | — | 決定 cookie 的 `secure`、`sameSite`、`domain` |
| `domain` | `string` | `isProd` 時 | — | 正式環境 cookie 網域 |
| `redis.host` | `string` | 是 | `localhost` | Redis 主機 |
| `redis.port` | `number` | 是 | `6379` | Redis 連接埠 |
| `redis.password` | `string` | 否 | — | Redis 密碼 |
| `redis.db` | `number` | 否 | `0` | Redis 資料庫編號 |
| `checkUserExists` | `(userId: string) => Promise<boolean>` | 是 | — | 續期時確認使用者仍存在 |
| `AccessTokenCookieKey` | `string` | 型別上必填 | `access_token` | Access Token cookie 名稱 |
| `RefreshTokenCookieKey` | `string` | 型別上必填 | `refresh_id` | Refresh ID cookie 名稱 |

## init 的驗證與錯誤

| 情況 | 結果 |
|---|---|
| `publicKey` 與 `publicKeyPath` 都未提供 | 拋出 `publicKey is required` |
| `privateKey` 與 `privateKeyPath` 都未提供 | 拋出 `privateKey is required` |
| 金鑰路徑不存在 | `readFileSync` 拋出的錯誤原樣傳出 |
| Redis 連線失敗 | 以 `console.error` 記錄後拋出 |

`init()` 會直接修改傳入的設定物件：讀入的金鑰寫回 `publicKey`／`privateKey`，cookie 名稱補上預設值。

## 金鑰來源

```typescript
import { JWTAuth } from "@pardnchiu/jwt-auth";

// 從環境變數讀取 PEM 內容，適合容器部署
await JWTAuth.init({
  privateKey: process.env.JWT_PRIVATE_KEY,
  publicKey: process.env.JWT_PUBLIC_KEY,
  accessTokenExpires: 900,
  refreshTokenExpires: 604800,
  isProd: true,
  domain: "example.com",
  AccessTokenCookieKey: "access_token",
  RefreshTokenCookieKey: "refresh_id",
  redis: { host: "redis", port: 6379, password: process.env.REDIS_PASSWORD },
  checkUserExists: async (userId) => true,
});
```

套件本身不讀取任何環境變數。

## 行程訊號

匯入套件時即註冊 `SIGINT` 與 `SIGTERM` 處理器：呼叫 `JWTAuth.close()` 後執行 `process.exit(0)`。應用若有自己的優雅關閉流程，需注意此處理器會在 Redis 斷線後立即結束行程。

相關：[Token 傳遞](/zh/token-transport)、[API 參考](/zh/api-reference)
