从字符串创建 NodeJS KeyObject

Create a NodeJS KeyObject from a string

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

我正在使用 jsonwebtoken to create/verify JWTs, but it can't run in nextjs middleware edge functions, so I want to migrate to using jose。问题是,在 jose 中,您无法使用 .env 文件中的秘密字符串对 JWT 进行签名,您需要创建一个加密的 KeyObject 并使用它来对 JWT 进行签名。

// example env file
JWT_SECRET=Swe4g7c?UBm5Nrd96vhsVDtkyJFbqKMTm!TMw5BDRLtaCFAXNvbq?s4rGKQSZnUP

我试图用下面的 API 创建一个 KeyObject,但是我从 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."

我也尝试使用 Uint8Array,因为 jose docs 说我可以,但我得到这个错误:

const key = new TextEncoder().encode(process.env.JWT_SECRET);
const jwt = new jose.SignJWT(payload).sign(key); 

// Error: Key must be one of type KeyObject or CryptoKey. Received an instance of Uint8Array.`

提前感谢您提供的任何帮助、评论、链接和资源!

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

example 展示了这是如何完成的,合适的对称算法是 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