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.
