示例说明
解析并验证 JWT 签名、过期和自定义声明,带显式时钟容差和受众校验。本示例属于认证与令牌场景,提供可直接复制使用的javascript代码片段,附带边界条件与使用注意事项。
技术要点
- 验证签名后检查 exp 过期和 aud 受众
- tolerance 容许时钟偏差秒数
- base64url 解码还原 payload 字节
代码解读
上述代码实现了JWT 验证过期和自定义声明的核心逻辑。解析并验证 JWT 签名、过期和自定义声明,带显式时钟容差和受众校验。代码中包含输入校验、核心算法和结果返回三个部分。关键在于正确处理边界情况,例如空输入、非法参数和并发场景。验证签名后检查 exp 过期和 aud 受众,tolerance 容许时钟偏差秒数。这些设计确保代码在生产环境中的健壮性。
使用建议
在实际项目中使用本示例时,建议先理解JWT 验证过期和自定义声明的适用场景与限制条件。base64url 解码还原 payload 字节。根据具体业务需求调整参数配置,并编写单元测试覆盖正常路径与边界情况。本代码片段可直接集成到现有项目中,或作为参考实现自行扩展。
代码示例
export async function verifyJWT(token,{secret,tolerance=0,audience}={}){const[header,payload,sig]=token.split('.');const enc=new TextEncoder();const keyObj=await crypto.subtle.importKey('raw',enc.encode(secret),{name:'HMAC',hash:'SHA-256'},false,['verify']);const valid=await crypto.subtle.verify('HMAC',keyObj,base64urlDecode(sig),enc.encode(header+'.'+payload));if(!valid)throw new Error('invalid signature');const claims=JSON.parse(new TextDecoder().decode(base64urlDecode(payload)));const now=Math.floor(Date.now()/1000);if(claims.exp!==undefined&&now>claims.exp+tolerance)throw new Error('token expired');if(audience&&claims.aud!==audience)throw new Error('audience mismatch');return claims;}function base64urlDecode(s){const b64=s.replace(/-/g,'+').replace(/_/g,'/')+'==='.slice(0,(4-s.length%4)%4);return Uint8Array.from(atob(b64),c=>c.charCodeAt(0));}