工作原理
OpenID Connect 是构建在 OAuth 2.0 之上的身份层。客户端使用带 PKCE 的授权码流程并请求 openid scope。授权服务器返回签名的 ID Token(JWT,包含 iss、sub、aud、exp 和 nonce)以及用于调用 API 的访问令牌。位于 /.well-known/openid-configuration 的发现文档公布端点和签名密钥,客户端无需硬编码供应商细节。
使用场景与权衡
OIDC 适用于单点登录、社交登录和跨产品身份联合。ID Token 回答“用户是谁”,访问令牌回答“该客户端能调用什么”。创建会话前必须校验签名、签发者、受众、过期时间和 nonce;API 侧应单独校验访问令牌,绝不能把 ID Token 当作 API 凭证。代价是发现文档缓存、密钥轮换、时钟偏差、重定向 URI 注册以及各供应商不同的登出语义,需要逐家测试。
示例与误区
const { payload } = await jwtVerify(idToken, jwks, {
issuer: 'https://auth.example.com',
audience: 'client-123',
});
if (payload.nonce !== expectedNonce) throw new Error('nonce mismatch');
OIDC 不是 OAuth 的替代品,而是其配置档;访问令牌不代表用户身份,ID Token 也不应发送给 API 作为授权凭证。仅验证签名不够,还必须检查受众和签发者,以防令牌替换。相关概念包括 OAuth 作用域、OAuth 2.0 PKCE 和 JWT。