一、基线策略与参数
- 有效期建议≤900秒;固定`alg`并校验`kid`;强校验`aud/iss`与时间偏差。
- 令牌含`jti`并支持撤销;登录与敏感操作进行旋转与老令牌回收。
二、Base64URL与签名
```ts
import crypto from 'crypto'
function b64url(input: Buffer): string {
return input.toString('base64').replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_')
}
function b64urlJson(obj: any): string {
return b64url(Buffer.from(JSON.stringify(obj)))
}
```
三、签发与验证(HS256示例)
```ts
type Key = { kid: string; key: Buffer }
type Claims = { sub: string; aud: string; iss: string; exp: number; nbf?: number; iat: number; jti: string; scope?: string[] }
function signHS256(header: any, payload: any, key: Buffer): string {
const h = b64urlJson(header)
const p = b64urlJson(payload)
const data = `${h}.${p}`
const mac = crypto.createHmac('sha256', key).update(data).digest()
const s = b64url(mac)
return `${data}.${s}`
}
function verifyHS256(token: string, key: Buffer, expectAlg: string): { ok: boolean; payload?: Claims } {
const parts = token.split('.')
if (parts.length !== 3) return { ok: false }
const [h, p, s] = parts
const head = JSON.parse(Buffer.from(h.replace(/-/g,'+').replace(/_/g,'/'), 'base64').toString('utf8'))
if (head.alg !== expectAlg) return { ok: false }
const data = `${h}.${p}`
const mac = crypto.createHmac('sha256', key).update(data).digest()
const expect = b64url(mac)
if (expect !== s) return { ok: false }
const payload = JSON.parse(Buffer.from(p.replace(/-/g,'+').replace(/_/g,'/'), 'base64').toString('utf8')) as Claims
return { ok: true, payload }
}
```
四、签发与旋转
```ts
function nowSec(): number { return Math.floor(Date.now() / 1000) }
function randJti(): string { return crypto.randomBytes(16).toString('hex') }
function issueToken(key: Key, claims: Omit

发表评论 取消回复