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)