模拟 jwt 签名的私钥

Mock a private key for jwt signing

我在我的 nodejs+typescript 项目中使用 jsonwebtoken。现在,我想测试接受私钥(作为字符串)的函数。

import { sign } from 'jsonwebtoken';
//function to test
function generateToken(privateKey: string) {
  const payload = {...};
  return sign(payload, privateKey);
}

我的笑话测试:

describe('token generator', () => {
  it('', () => {
     // I mock the private key in my test
     const pKey = 'dummy_pkey';

     const token = generateToken(pKey);
      ...
   })

当我 运行 玩笑测试时,我得到以下指向生产代码的错误 return sign(payload, privateKey) :

error:0909006C:PEM routines:get_name:no start line

显然 jsonwebtoken 库的私钥无效。那么,在开玩笑中模拟私钥以签署 jwt 令牌的最佳方法是什么?

------------更新--------

我尝试使用 nodeJs 提供的加密:

import { generateKeyPairSync } from 'crypto';

describe('token generator', () => {
  it('', () => {
      const { privateKey } = generateKeyPairSync('rsa', {
          modulusLength: 2048,
       });
     const token = generateToken(privateKey);
      ...
   })

但我得到了同样的错误: error:0909006C:PEM routines:get_name:no start line,为什么? (我知道这是因为 PEM 缺少起始行,但为什么,我哪里错了?在测试中使用 jsonwebtoken 和 crytpo 作为私钥)

您在生成密钥对时没有为您public和私钥提供编码选项。我不知道默认值是什么,但是这个

const { privateKey, publicKey } = generateKeyPairSync('rsa', {
    modulusLength: 2048,
    publicKeyEncoding: {
      type: 'spki',
      format: 'pem'
    },
    privateKeyEncoding: {
      type: 'pkcs8',
      format: 'pem',
    }
  })

当我将它与 jwt.sign(payload, privateKey, signOptions)

一起使用时对我有用

还有docs状态

When encoding public keys, it is recommended to use 'spki'. When encoding private keys, it is recommended to use 'pkcs8' with a strong passphrase, and to keep the passphrase confidential.