1.2.0 • Published 7 years ago
@transomjs/transom-mongoose-nonce v1.2.0
transom-mongoose-nonce
Create and consume one-time-use, short lifetime tokens with a payload within Transom.
Installation
$ npm install --save @transomjs/transom-mongoose-nonceUsage
Created specifically for SocketIO handshaking but useful for many things, the transom-mongoose-nonce module uses mongoose to provide the ability to create and consume nonces. On initialization, a nonce handler is created and added to the Transom server registry. It has only two methods, createNonce and verifyNonce.
createNonce
createNonce takes three arguments, as follows:
payloadcan be any JavaScript object. It will get stored until the Nonce is consumed.expirySecondsa period after which the nonce is no longer valid and cannot be consumed.callbackis called after the nonce is created. Arguments are (err, nonce).
verifyNonce
verifyNonce takes two arguments, as follows:
tokenthis is a 64 byte unique keycallbackis called with the result of the nonce lookup. Arguments are (err, payload).
Example: createNonce
This is an example endpoint to create a nonce for the SocketIO handshake, switching from an AJAX request to a socket connection.
function handleSocketToken(req, res, next) {
var p = new Promise(function (resolve, reject) {
// Create the nonce with the current User object as it's payload.
const expirySeconds = 5;
// The NonceHandler is stored in the server Registry.
const transomNonce = server.registry.get('transomNonce');
transomNonce.createNonce(req.locals.user, expirySeconds, function (err, nonce) {
if (err) {
return reject(err);
}
resolve(nonce);
});
}).then(function (nonce) {
res.json({
token: nonce.token
});
next();
}).catch(function (err) {
next(err);
});
}; Example: verifyNonce
This example middleware used on the SocketIO side, telling the socket connection which user it is for.
function nonceAuthMiddleware(socket, next) {
// Get the NonceHandler from the server Registry.
const nonce = args.server.registry.get('transomNonce');
nonce.verifyNonce(socket.handshake.query.token, function (err, payload) {
if (err) {
setTimeout(function () {
// Socket Authentication failed. Disconnecting.
socket.disconnect(true);
}, 20);
return next(new Error(INVALID_TOKEN));
}
// Store the User object on each verified socket connection,
// we can use this later to emit data to specific users.
socket.transomUser = payload;
return next();
});
}