jwt-redis-session
Version:
JSON Web Token session middleware backed by Redis
66 lines (50 loc) • 1.71 kB
JavaScript
var _ = require("lodash"),
jwt = require("jsonwebtoken"),
utils = require("./utils");
module.exports = function(options){
if(!options.client || !options.secret)
throw new Error("Redis client and secret required for JWT Redis Session!");
options = {
client: options.client,
secret: options.secret,
algorithm: options.algorithm || "HS256",
keyspace: options.keyspace || "sess:",
maxAge: options.maxAge || 86400,
requestKey: options.requestKey || "session",
requestArg: options.requestArg || "accessToken"
};
var SessionUtils = utils(options);
var requestHeader = _.reduce(options.requestArg.split(""), function(memo, ch){
return memo + (ch.toUpperCase() === ch ? "-" + ch.toLowerCase() : ch);
}, "x" + (options.requestArg.charAt(0) === options.requestArg.charAt(0).toUpperCase() ? "" : "-"));
return function jwtRedisSession(req, res, next){
req[options.requestKey] = new SessionUtils();
var token = req.get(requestHeader)
|| req.query[options.requestArg]
|| (req.body && req.body[options.requestArg]);
if(token){
jwt.verify(token, options.secret, function(error, decoded){
if(error || !decoded.jti)
return next();
options.client.get(options.keyspace + decoded.jti, function(err, session){
if(err || !session)
return next();
try{
session = JSON.parse(session);
}catch(e){
return next();
}
_.extend(req[options.requestKey], session);
req[options.requestKey].claims = decoded;
req[options.requestKey].id = decoded.jti;
req[options.requestKey].jwt = token;
// Update the TTL
req[options.requestKey].touch(_.noop);
next();
});
});
}else{
next();
}
};
};