I'm testing Google OAuth2.0 on node.js + express and using express-session for managing session, and I came across that I need Secret Key for my session manager.
So I did some research and found a post, which has some nice suggestions. But it seems to require some workarounds, like setting secret key as environment variable or keeping it in configuration file.
- Using the former, I need to enter environment variables every time I redeploy sever.
- Using the latter exposes my secret key to SCM.
So I decided to generate random string and store it in the host file system. It seems to solve all the problems I introduced above, but I'm noob to web development so I'm not sure whether this is legit.
Is there any cons or exploit to this method?
Below is my sessionSecret.js file:
var crypto = require('crypto');
var fs = require('fs');
var filePath = '/home/ubuntu/results.txt';
function readSecretKey() {
return new Promise(function(resolve, reject) {
fs.readFile(filePath, 'utf8', function(err, key) {
if (err) {
reject(err);
} else {
resolve(key);
}
});
});
}
function writeSecretKey(key) {
return new Promise(function(resolve, reject) {
fs.writeFile(filePath, key, function(err) {
if (err) {
reject(err);
} else {
resolve(key);
}
});
});
}
function generateRandomString() {
return new Promise(function(resolve, reject) {
crypto.randomBytes(48, function(err, buf) {
if (err) {
reject(err);
} else {
resolve(buf.toString('hex'));
}
})
});
}
module.exports.getOrCreate = function() {
return new Promise(function(resolve, reject) {
readSecretKey()
.then(function(key) {
console.log("Key exists: " + key);
resolve(key);
}, function() {
console.log("Key does not exists. Generating...");
return generateRandomString();
})
.then(function(key) {
if (key) {
console.log("Key generated: " + key);
return writeSecretKey(key);
}
}).then(function(key) {
if (key) {
resolve(key);
}
}, function(err) {
reject(err);
});
});
};