/ / Erreur PEM lors de la génération du jeton d'accès à l'installation GitHub - node.js, github, encryption, jwt

Erreur PEM lors de la génération du jeton d'accès à l'installation GitHub - node.js, github, encryption, jwt

J'essaie d'automatiser le processus décrit sur cette page en utilisant Node.js.

Jusqu'à présent, j'ai trouvé ce qui suit:

const axios = require("axios");
var fs = require("fs");
var NodeRSA = require("node-rsa");
var jwt = require("jsonwebtoken");


exports.openedPOST = function openedPOST(req, res) {

// Private key contents
var private_pem = fs.readFileSync("test-runner.pem");
var key = new NodeRSA({b: 512});
var private_key = key.encrypt(private_pem, "base64");

// generate jwt
const now = Math.round(Date.now() / 1000);
const payload = {
// issued at time
iat : now,
// expires in 10min
exp : now + (10 * 60),
// Github app id
iss : 7233
};

const token = jwt.sign(payload, private_key, { algorithm: "RS256" })

// auth to github
var instance = axios({
method: "get",
url: "https://api.github.com/app",
headers: {
"Accept" : "application/vnd.github.machine-man-preview+json",
"Authorization" : `Bearer ${token}`
}
})
.then(function(response) {
console.log("Response: ",response.data);
})
.catch(function(error) {
console.warn("Unable to authenticate");
// The request was made and the server responded with a status code
// that falls out of the range of 2xx
if (error.response) {
console.warn(`Status ${error.response.status}`);
console.warn(`${error.response.data.message}`);
}
});
};
exports.openedPOST();

Cela me donne l'erreur suivante:

crypto.js:331
var ret = this._handle.sign(toBuf(key), passphrase, rsaPadding,
^

Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
at Sign.sign (crypto.js:331:26)
at Object.sign (/modules/jwa/index.js:55:45)
at Object.jwsSign [as sign] (/modules/jws/lib/sign-stream.js:23:24)
at Object.module.exports [as sign] (/modules/jsonwebtoken/sign.js:186:16)
at Object.openedPOST (GenerateAccessToken.js:29:21)
at Object.<anonymous> (GenerateAccessToken.js:58:9)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)

Je pense que la question a quelque chose à voir avec la private_key génération comme quand je génère manuellement un private_key et le code dur à la place de jwt.sign(payload, private_key, { algorithm: "RS256" }) J'obtiens le résultat auquel je m'attendais.

Les pensées autour de ce qui pourrait être faux sont que new NodeRSA({b: 512}); devrait être quelque chose de différent. Je pensais que ça pourrait être new NodeRSA({b: 256}); mais cela me donne l'erreur suivante:

/Users/paulcarron/Desktop/node_modules/jsonwebtoken/sign.js:97
throw err;
^

Error: secretOrPrivateKey must have a value
at Object.module.exports [as sign] (/modules/jsonwebtoken/sign.js:101:20)
at Object.openedPOST (GenerateAccessToken.js:29:21)
at Object.<anonymous> (GenerateAccessToken.js:58:9)
at Module._compile (module.js:635:30)
at Object.Module._extensions..js (module.js:646:10)
at Module.load (module.js:554:32)
at tryModuleLoad (module.js:497:12)
at Function.Module._load (module.js:489:3)
at Function.Module.runMain (module.js:676:10)
at startup (bootstrap_node.js:187:16)

Une autre pensée était que les contenes de test-runner.pem était incorrect mais cela commence par -----BEGIN RSA PRIVATE KEY----- et se termine par -----END RSA PRIVATE KEY-----. En outre, j'utilise le même fichier lors de la génération manuelle du jeton. Cependant, si j'écris private_pem sur la console, il affiche ce qui suit:

<Buffer 2d 2d 2d 2d 2d 42 45 47 49 4e 20 52 53 41 20 50 52 49 56 41 54 45 20 4b 45 59 2d 2d 2d 2d 2d 0a 4d 49 49 45 6f 77 49 42 41 41 4b 43 41 51 45 41 31 65 ... >

Je ne suis pas sûr que ce soit correct ou non.

Qu'est-ce que je fais mal?

Réponses:

2 pour la réponse № 1

Je l'ai fait fonctionner.

const axios = require("axios");
var fs = require("fs");
var jwt = require("jsonwebtoken");

var gitInstallationAccessToken = {

genJWTToken: function() {
// Private key contents
var private_key = fs.readFileSync("./path/to/my/pem_file.pem");

// generate jwt
const now = Math.round(Date.now() / 1000);
const payload = {
// issued at time
iat : now,
// expires in 10min
exp : now + (10 * 60),
// Github app id
iss : 1234
};

const token = jwt.sign(payload, private_key, { algorithm: "RS256" })
return token;
},

genInstallationAccessToken: function(callback) {
var instance = axios({
method: "post",
url: "https://api.github.com/installations/1234/access_tokens",
headers: {
"Accept" : "application/vnd.github.machine-man-preview+json",
"Authorization" : `Bearer ` + gitInstallationAccessToken.genJWTToken()
}
})
.then(function(response) {
callback(response.data.token);
})
.catch(function(error) {
console.warn("Unable to authenticate");
// The request was made and the server responded with a status code
// that falls out of the range of 2xx
if (error.response) {
console.warn(`Status ${error.response.status}`);
console.warn(`${error.response.data.message}`);
}
});
}
}

module.exports = gitInstallationAccessToken;