UNPKG

jwt-redis-session

Version:

JSON Web Token session middleware backed by Redis

105 lines (88 loc) 2.51 kB
var _ = require("lodash"), jwt = require("jsonwebtoken"), uuid = require("node-uuid"); var extendSession = function(session, data){ _.reduce(data, function(memo, val, key){ if(typeof val !== "function" && key !== "id") memo[key] = val; return memo; }, session); }; var serializeSession = function(session){ return _.reduce(session, function(memo, val, key){ if(typeof val !== "function" && key !== "id") memo[key] = val; return memo; }, {}); }; // these are bound to the session module.exports = function(options){ var SessionUtils = function(){}; _.extend(SessionUtils.prototype, { // create a new session and return the jwt create: function(claims, callback){ if(typeof claims === "function" && !callback){ callback = claims; claims = {}; } var self = this, sid = uuid.v4(); var token = jwt.sign(_.extend({ jti: sid }, claims || {}), options.secret, { algorithm: options.algorithm }); options.client.setex(options.keyspace + sid, options.maxAge, JSON.stringify(serializeSession(self)), function(error){ self.id = sid; callback(error, token); }); }, // update the TTL on a session touch: function(callback){ if(!this.id){ return process.nextTick(function(){ callback(new Error("Invalid session ID")); }); } options.client.expire(options.keyspace + this.id, options.maxAge, callback); }, // update a session's data, update the ttl update: function(callback){ if(!this.id){ return process.nextTick(function(){ callback(new Error("Invalid session ID")); }); } options.client.setex(options.keyspace + this.id, options.maxAge, JSON.stringify(serializeSession(this)), callback); }, // reload a session data from redis reload: function(callback){ var self = this; if(!this.id){ return process.nextTick(function(){ callback(new Error("Invalid session ID")); }); } options.client.get(options.keyspace + self.id, function(error, resp){ if(error) return callback(error); try{ resp = JSON.parse(resp); }catch(e){ return callback(e); } extendSession(self, resp); callback(); }); }, // destroy a session destroy: function(callback){ if(!this.id){ return process.nextTick(function(){ callback(new Error("Invalid session ID")); }); } options.client.del(options.keyspace + this.id, callback); }, toJSON: function(){ return serializeSession(this); } }); return SessionUtils; };