node.js - Mock en privat nøkkel for jwt-signering


Jeg bruker jsonwebtoken i mitt Node.js+TypeScript-prosjekt. Nå ønsker jeg å teste funksjonen min som aksepterer privat nøkkel (som streng).

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

Min jest-test:

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

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

Når jeg kjører jest-testen, får jeg følgende feil som peker på produksjonskoden return sign(payload, privateKey) :

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

Tilsynelatende er privatnøkkelen ugyldig for jsonwebtoken-biblioteket. Så, hva er den beste måten å simulere en privatnøkkel for å signere jwt-token i jest på?

----------- oppdatering ---------

Jeg prøvde å bruke kryptografi levert av NodeJs:

import { generateKeyPairSync } from 'crypto';

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

Men jeg får samme feilen: error:0909006C:PEM routines:get_name:no start line, hvorfor? (Jeg vet at det er fordi PEM mangler en startlinje, men hvorfor, hvor gjør jeg feil? bruker jsonwebtoken & crypto for privat nøkkel i test)

Svar #1

Du oppga ikke kodingsalternativer for din offentlige og private nøkkel når du genererte nøkkelparet. Jeg vet ikke hva standardinnstillingene er, men dette

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

fungerer for meg når jeg bruker det med jwt.sign(payload, privateKey, signOptions)

Også dokumentene sier

Når man koder offentlige nøkler, anbefales det å bruke 'spki'. Når man koder private nøkler, anbefales det å bruke 'pkcs8' med en sterk passfrase, og å holde passfrasen konfidensiell.

Relaterte artikler