← 中文资源

简体中文版本

用 JWKS 校验 OIDC 令牌

获取签发方 JWKS、校验签名,检查 iss、aud、exp 与 nbf,按 kid 缓存密钥并在轮换时刷新。

阅读英文原文

概述

只解码 JWT 载荷而不验签名,等于相信攻击者自填的声明。正确做法是取签发方的公钥验签,并逐项校验签发者、受众与时效,再按 kid 缓存公钥以处理轮换。

关键步骤

  1. 从签发方 JWKS 获取公钥并按 kid 缓存。
  2. 校验签名,任何失败即拒绝。
  3. 校验 iss、aud、exp 与 nbf 是否符合预期。
  4. 遇到未知 kid 时刷新 JWKS,并限制刷新频率。

验证

  • 伪造签名的令牌被拒绝。
  • 过期或受众不符的令牌被拒绝。
  • 密钥轮换后无需每请求抓取即可通过。
  • 不接受 alg 为 none。

注意事项

  • JWKS 校验证明令牌真实,但不等同于授权,仍需检查 scope。
  • 签发方与校验方时钟偏差可能让有效令牌失败,需允许小量容差。

适用范围

本条目围绕「用 JWKS 校验 OIDC 令牌」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

const { payload } = await jwtVerify(token, getKey, {
  issuer: 'https://issuer.example.com',
  audience: 'my-api',
  algorithms: ['RS256'],
});