diff --git a/index.js b/index.js index 01752a12..98f6ac12 100644 --- a/index.js +++ b/index.js @@ -156,6 +156,8 @@ function session(options) { // generates the new session store.generate = function(req){ req.sessionID = generateId(req); + if(secret) + req.sessionSignedID = 's:' + signature.sign(req.sessionID, secret[0]) req.session = new Session(req); req.session.cookie = new Cookie(cookieOptions); @@ -213,7 +215,9 @@ function session(options) { req.sessionStore = store; // get the session ID from the cookie - var cookieId = req.sessionID = getcookie(req, name, secrets); + var ck_and_raw = getcookie(req, name, secrets) + var cookieId = req.sessionID = ck_and_raw[0]; + req.sessionSignedID = ck_and_raw[1]; // set-cookie onHeaders(res, function(){ @@ -502,6 +506,15 @@ function generateSessionId(sess) { return uid(24); } +function getCookieByAuthorizationBearerToken(req) { + var token = req.get('Authorization'); + if (!token) { + return null; + } + token = token.replace(/Bearer:\s*/, '').replace(/\s*/, '') + return token; +} + /** * Get the session ID cookie from request. * @@ -510,30 +523,46 @@ function generateSessionId(sess) { */ function getcookie(req, name, secrets) { - var header = req.headers.cookie; + var raw; var val; - // read from cookie header - if (header) { - var cookies = cookie.parse(header); + if (req.useAuthorizationBearerToken) { - raw = cookies[name]; + raw = getCookieByAuthorizationBearerToken(req) - if (raw) { - if (raw.substr(0, 2) === 's:') { - val = unsigncookie(raw.slice(2), secrets); + } else if (req.__customToken__) { - if (val === false) { - debug('cookie signature invalid'); - val = undefined; - } - } else { - debug('cookie unsigned') + raw = req.__customToken__; + + } else { + + var header = req.headers.cookie; + + if (header) { + var cookies = cookie.parse(header); + + raw = cookies[name]; + } + } + + if (raw) { + if (raw.substr(0, 2) === 's:') { + val = unsigncookie(raw.slice(2), secrets); + + if (val === false) { + debug('cookie signature invalid'); + val = undefined; } + } else { + debug('cookie unsigned') } } + if (req.useAuthorizationBearerToken) { + return [val, raw]; + } + // back-compat read from cookieParser() signedCookies data if (!val && req.signedCookies) { val = req.signedCookies[name]; @@ -565,7 +594,7 @@ function getcookie(req, name, secrets) { } } - return val; + return [val, raw]; } /**