从字符串创建 NodeJS KeyObject

TJB*_*man 1 cryptography node.js jwt jose next.js

如何从 .env 文件中的随机字符串创建 NodeJS Crypto KeyObject?

我使用jsonwebtoken来创建/验证 JWT,但它无法在 nextjs 中间件边缘函数中运行,因此我想迁移到使用jose。问题是,在 jose 中,您无法使用 .env 文件中的秘密字符串对 JWT 进行签名,您需要创建一个加密 KeyObject 并使用它来对 JWT 进行签名。

// example env file
JWT_SECRET=Swe4g7c?UBm5Nrd96vhsVDtkyJFbqKMTm!TMw5BDRLtaCFAXNvbq?s4rGKQSZnUP
Run Code Online (Sandbox Code Playgroud)

我尝试使用下面的 API 创建 KeyObject,但我收到 jose 的错误:

// example env file
JWT_SECRET=Swe4g7c?UBm5Nrd96vhsVDtkyJFbqKMTm!TMw5BDRLtaCFAXNvbq?s4rGKQSZnUP
Run Code Online (Sandbox Code Playgroud)

我还尝试使用 Uint8Array,因为jose 文档说我可以,但我收到此错误:

import crypto from 'crypto'; 
const key = crypto.createSecretKey(process.env.JWT_SECRET, 'utf-8'); 
const jwt = new jose.SignJWT(payload).sign(key); 

// Error: KeyObject or CryptoKey instance for asymmetric algorithms must not be of type "secret."
Run Code Online (Sandbox Code Playgroud)

预先感谢您的任何帮助、评论、链接、资源!

小智 7

您唯一缺少的是使用适当的对称 JWS 算法 (alg) 设置 JOSE 保护标头。

示例展示了这是如何完成的,并且适当的对称算法是 HS256。

import * as jose from "jose";

const secret = new TextEncoder().encode(
  "Swe4g7c?UBm5Nrd96vhsVDtkyJFbqKMTm!TMw5BDRLtaCFAXNvbq?s4rGKQSZnUP"
);

const jwt = await new jose.SignJWT({ foo: "bar" })
  .setProtectedHeader({ alg: "HS256" })
  .sign(secret);
console.log(jwt); // eyJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIifQ.iPFY1ibZc5dTBzRD46ma-Du0avf20nYKtQQsgnyf7ZM
Run Code Online (Sandbox Code Playgroud)

  • 最后说明:对于在 NextJS 中间件(边缘函数)中运行此程序的任何人来说,不支持加密(至少现在不支持)。使用 TextEncoder 创建 Uint8Array。 (3认同)