驗證結果

最後更新

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

結構

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

路由分流

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 輪替、裝置指紋

EN