跳转到内容

Token 吊销存储

Token 吊销存储提供了 Token 黑名单(吊销列表)的抽象接口与两种实现。当需要使已签发的 JWT 失效时(如用户登出、密码修改),可将 Token JTI 加入吊销列表。

适用于开发环境或单实例部署,基于 Map 存储,支持 TTL 过期检查与懒清理。

import { createMemoryRevocationStore } from "@ventostack/auth";
const store = createMemoryRevocationStore();
// 吊销 Token(ttl 单位为毫秒)
await store.add("token-jti-123", 3600_000);
// 检查是否已吊销
const revoked = await store.has("token-jti-123"); // true
const notRevoked = await store.has("other-jti"); // false

适用于生产环境与分布式部署,基于 Redis SET + PEXPIRE 实现 TTL 自动过期。

import { createRedisRevocationStore } from "@ventostack/auth";
import { createRedisClient } from "@ventostack/cache";
const redis = createRedisClient({ url: "redis://localhost:6379" });
const store = createRedisRevocationStore(redis, "revocation:");
// 吊销 Token
await store.add("token-jti-123", 3600_000);
// 检查是否已吊销
const revoked = await store.has("token-jti-123"); // true

无参数。

createRedisRevocationStore(client, prefix?)

Section titled “createRedisRevocationStore(client, prefix?)”
参数类型默认值说明
clientRedisRevocationClientLikeRedis 客户端实例(必填)
prefixstring"token_revocation:"键前缀
interface RedisRevocationClientLike {
set(key: string, value: string): Promise<unknown>;
pexpire(key: string, milliseconds: number): Promise<number>;
exists(key: string): Promise<boolean>;
}
interface TokenRevocationStore {
add(jti: string, ttl: number): Promise<void>;
has(jti: string): Promise<boolean>;
}
// 登出时吊销当前 Token
const payload = jwt.verify(accessToken, secret);
await revocationStore.add(payload.jti, payload.exp * 1000 - Date.now());
// 请求鉴权时检查吊销状态
if (await revocationStore.has(payload.jti)) {
throw new UnauthorizedError("Token 已被吊销");
}
  • 内存实现会在 has() 调用时懒清理过期条目,不会主动回收
  • Redis 实现使用毫秒级 TTL(PEXPIRE),Token 过期后自动删除,无需手动清理
  • ttl 参数建议设置为 Token 剩余有效时间,避免吊销列表无限增长