Javascript Jose 签名并加密 JWT

问题描述 投票:0回答:1

我正在使用 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

javascript next.js jwt jose
1个回答
0
投票

要先签名然后加密,您需要使用

SignJWT
类进行签名,然后使用
CompactEncrypt
来加密签名结果。 github.com/panva/jose/issues/112 就是一个例子,只需用您的秘密替换密钥管理并使用适当的算法即可。

© www.soinside.com 2019 - 2024. All rights reserved.