从字符串创建 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
如何从 .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