# 驗證結果

本頁說明 `VerifyJWT()` 回傳的 `VerifyResult` 三個旗標代表什麼，以及每種情境對應的值。

## 結構

```typescript
interface VerifyResult {
  data?: AuthData;
  isAuth: boolean;
  isError: boolean;
  isGuest: boolean;
}
```

| 旗標 | 意義 |
|---|---|
| `isAuth` | 驗證成功，`data` 為使用者資料 |
| `isError` | 請求可疑（指紋不符、簽章無效等），建議回 400 |
| `isGuest` | 未登入；`isAuth` 為 `false` 時一律為 `true` |

## 情境對照

| 情境 | `isAuth` | `isError` | `isGuest` |
|---|---|---|---|
| Access Token 有效且指紋相符 | `true` | `false` | `false` |
| Access Token 過期，續期成功 | `true` | `false` | `false` |
| 沒有 Access Token 與 Refresh ID | `false` | `false` | `true` |
| Access Token 在撤銷黑名單 | `false` | `false` | `true` |
| `checkUserExists()` 回傳 `false` | `false` | `false` | `true` |
| Refresh 資料指紋不符 | `false` | `false` | `true` |
| Access Token 指紋不符 | `false` | `true` | `true` |
| 簽章無效或 Token 格式錯誤 | `false` | `true` | `true` |
| Refresh 資料不存在 | `false` | `true` | `true` |

## 路由分流

```typescript
import { NextFunction, Request, Response } from "express";
import { JWTAuth } from "@pardnchiu/jwt-auth";

export async function requireAuth(req: Request, res: Response, next: NextFunction) {
  try {
    const result = await JWTAuth.VerifyJWT(req, res);
    if (result.isAuth) {
      res.locals.user = result.data;
      return next();
    }
    res.status(result.isError ? 400 : 401).json({
      error: result.isError ? "Bad Request" : "Unauthorized",
    });
  } catch (err) {
    // 只有未呼叫 init() 時會到這裡
    res.status(500).json({ error: (err as Error).message });
  }
}
```

## 舊版回傳值

舊版 `VerifyJWT()` 回傳 `AuthData` 或狀態碼 `400`／`401`。`JWTAuth.GetAuth()` 可把舊值轉成同樣的三旗標結構：

| 輸入 | 輸出 |
|---|---|
| `AuthData` | `{ ...data, isAuth: true, isError: false, isGuest: false }` |
| `401` | `{ isAuth: false, isError: false, isGuest: true }` |
| `400` | `{ isAuth: false, isError: true, isGuest: true }` |

相關：[Refresh Token 輪替](/zh/token-refresh)、[裝置指紋](/zh/device-fingerprint)
