我正在编辑之前的文字以提供更多信息,并感谢大家的评论。我的时间戳是 1715013453,这是我的 Jwt 类的完整实现
class Jwt {
private ACCESS_TOKEN_LIFE = '15m';
private REFRESH_TOKEN_LIFE = '14d';
private ALG = 'HS512';
private ACCESS_TOKEN_SECRET = process.env.ACCESS_TOKEN_SECRET;
private REFRESH_TOKEN_SECRET = process.env.REFRESH_TOKEN_SECRET;
public async encode(id: string) {
const accessToken = await this.signJWT(id, this.ACCESS_TOKEN_LIFE, this.ACCESS_TOKEN_SECRET);
const refreshToken = await this.signJWT(id, this.REFRESH_TOKEN_LIFE, this.REFRESH_TOKEN_SECRET);
return { accessToken, refreshToken };
}
public async verify(token: string, secret: string) {
try {
await jwtVerify(token, new TextEncoder().encode(secret));
return { ok: true, expired: false };
} catch (error) {
if (error instanceof Error && 'code' in error && error.code === JwtErrorCodes.Expired) {
return { ok: false, expired: true };
}
return { ok: false, expired: false };
}
}
public revalidate() {}
public revoke() {}
private async signJWT(id: string, expiresAt: string, secret?: string) {
if (!secret) throw new Error('Auth secret missing');
return await new SignJWT({ id })
.setProtectedHeader({ alg: this.ALG })
.setIssuedAt()
.setExpirationTime(expiresAt)
.setNotBefore('from now')
.sign(new TextEncoder().encode(secret));
}
}
禁用所有缓存后,我开始收到此错误,问题是我没有在令牌生命中的数字和字母之间放置空格,并且我使用“从现在开始”,如https://github.com/panva/jose /blob/main/docs/classes/jwt_sign.SignJWT.md#setnotbefore 从现在开始应该是例如 1 秒,这只是一个为了可读性的装饰器,非常感谢大家的帮助!
正如 @derpirscher 的评论所暗示的,要么你的
expiresAt
解析为 4 天前(根据 docs),要么你的机器时间已关闭,你可以通过运行 Date.now() / 1000 | 0
来检查