Add secretKey module

This commit is contained in:
Michael Jackson 2018-06-08 23:01:13 -07:00
parent 5c9c4f00e8
commit cb47fbf775
4 changed files with 46 additions and 31 deletions

2
.gitignore vendored
View File

@ -9,5 +9,5 @@ npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
private.key secret_key
/tokens /tokens

View File

@ -1,29 +1,8 @@
const fs = require("fs");
const path = require("path");
const crypto = require("crypto"); const crypto = require("crypto");
const jwt = require("jsonwebtoken"); const jwt = require("jsonwebtoken");
const invariant = require("invariant");
const forge = require("node-forge");
const db = require("./utils/redis"); const db = require("./utils/redis");
const secretKey = require("./secretKey");
let keys;
if (process.env.NODE_ENV === "production") {
keys = {
public: fs.readFileSync(path.resolve(__dirname, "../public.key"), "utf8"),
private: process.env.PRIVATE_KEY
};
invariant(keys.private, "Missing $PRIVATE_KEY environment variable");
} else {
// Generate a random keypair for dev/testing.
// See https://gist.github.com/sebadoom/2b70969e70db5da9a203bebd9cff099f
const keypair = forge.rsa.generateKeyPair({ bits: 2048 });
keys = {
public: forge.pki.publicKeyToPem(keypair.publicKey, 72),
private: forge.pki.privateKeyToPem(keypair.privateKey, 72)
};
}
function getCurrentSeconds() { function getCurrentSeconds() {
return Math.floor(Date.now() / 1000); return Math.floor(Date.now() / 1000);
@ -42,13 +21,18 @@ function createToken(scopes = {}) {
scopes scopes
}; };
jwt.sign(payload, keys.private, { algorithm: "RS256" }, (error, token) => { jwt.sign(
if (error) { payload,
reject(error); secretKey.private,
} else { { algorithm: "RS256" },
resolve(token); (error, token) => {
if (error) {
reject(error);
} else {
resolve(token);
}
} }
}); );
}); });
} }
@ -58,7 +42,7 @@ function verifyToken(token) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const options = { algorithms: ["RS256"] }; const options = { algorithms: ["RS256"] };
jwt.verify(token, keys.public, options, (error, payload) => { jwt.verify(token, secretKey.public, options, (error, payload) => {
if (error) { if (error) {
reject(error); reject(error);
} else { } else {
@ -107,7 +91,7 @@ function removeAllRevokedTokens() {
} }
function getPublicKey() { function getPublicKey() {
return keys.public; return secretKey.public;
} }
module.exports = { module.exports = {

31
server/secretKey.js Normal file
View File

@ -0,0 +1,31 @@
const fs = require("fs");
const path = require("path");
const forge = require("node-forge");
const invariant = require("invariant");
let secretKey;
if (process.env.NODE_ENV === "production") {
invariant(
process.env.PRIVATE_KEY,
"Missing $PRIVATE_KEY environment variable"
);
secretKey = {
public: fs.readFileSync(
path.resolve(__dirname, "../secret_key.pub"),
"utf8"
),
private: process.env.PRIVATE_KEY
};
} else {
// Generate a random keypair for dev/testing.
// See https://gist.github.com/sebadoom/2b70969e70db5da9a203bebd9cff099f
const keypair = forge.rsa.generateKeyPair({ bits: 2048 });
secretKey = {
public: forge.pki.publicKeyToPem(keypair.publicKey, 72),
private: forge.pki.privateKeyToPem(keypair.privateKey, 72)
};
}
module.exports = secretKey;