我正在使用 jose 来签名和加密 JWT。但是我无法签名然后加密我的整个 JWT。
我使用这个函数来签署我的jwt:
const secretKey = process.env.JWT_SECRET;
const key = new TextEncoder().encode(secretKey);
export async function _encrypt(payload: any) {
return await new SignJWT(payload)
.setProtectedHeader({ alg: "HS256" })
.setIssuedAt()
.setExpirationTime("10 sec from now")
.sign(key);
}
我使用以下代码对其进行加密(当传递 JWT 对象时它有效):
const now = () => (Date.now() / 1000) | 0;
const alg = "dir";
const enc = "A256CBC-HS512";
...
sync function encrypt({
payload,
maxAge,
}: {
payload: JWTPayload;
maxAge: number;
}): Promise<string> {
const secret: Uint8Array = randomBytes(32);
const salt = randomBytes(16);
const encryptionSecret: Uint8Array = await hkdf(
"sha256",
secret,
salt,
"Generated Encryption Key",
32
);
return new EncryptJWT(payload)
.setProtectedHeader({ alg, enc })
.setIssuedAt()
.setExpirationTime(now() + maxAge)
.setJti(crypto.randomUUID())
.encrypt(encryptionSecret);
}
代码无法按预期工作,因为 EncryptJWT 只接受 JWT 对象。这也反映在控制台中:
error TypeError: JWT Claims Set MUST be an object
要先签名然后加密,您需要使用
SignJWT
类进行签名,然后使用 CompactEncrypt
来加密签名结果。 github.com/panva/jose/issues/112 就是一个例子,只需用您的秘密替换密钥管理并使用适当的算法即可。