OAuth 2.1与OIDC企业级实施与风险缓解最佳实践概述通过强制PKCE、回调白名单与JWK验证,可显著降低授权码窃取与令牌滥用风险。PKCE参数生成function base64url(buf: Uint8Array): string {
return btoa(String.fromCharCode(...buf)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')
}
async function createPkce(): Promise<{ verifier: string; challenge: string }> {
const verifierBytes = crypto.getRandomValues(new Uint8Array(32))
const verifier = base64url(verifierBytes)
const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier))
const challenge = base64url(new Uint8Array(digest))
return { verifier, challenge }
}
回调白名单校验function isAllowedRedirect(uri: string, allow: string[]): boolean {
try {
const u = new URL(uri)
return allow.includes(u.origin + u.pathname)
} catch {
return false
}
}
OIDC ID Token验证import { createVerify } from 'crypto'
type Jwk = { kid: string; kty: string; n?: string; e?: string; crv?: string; x?: string; y?: string }
async function verifyIdToken(token: string, jwks: Jwk[], expected: { iss: string; aud: string }): Promise<boolean> {
const [h, p, s] = token.split('.')
const header = JSON.parse(atob(h.replace(/-/g, '+').replace(/_/g, '/')))
const payload = JSON.parse(atob(p.replace(/-/g, '+').replace(/_/g, '/')))
if (payload.iss !== expected.iss || payload.aud !== expected.aud) return false
if (payload.exp * 1000 < Date.now()) return false
const jwk = jwks.find(j => j.kid === header.kid)
if (!jwk || jwk.kty !== 'RSA') return false
const pub = buildRsaPublicKeyPem(jwk.n!, jwk.e!)
const verifier = createVerify('RSA-SHA256')
verifier.update(`${h}.${p}`)
verifier.end()
const sig = Buffer.from(s.replace(/-/g, '+').replace(/_/g, '/'), 'base64')
return verifier.verify(pub, sig)
}
风险缓解要点强制授权码流启用PKCE并验证 `code_verifier`严格的回调URI白名单与精确匹配令牌最短有效期与刷新令牌轮换与撤销通过PKCE与JWK验证、严格回调白名单与令牌治理,可实现企业级的OAuth/OIDC安全实施。

发表评论 取消回复