UNPKG

@strongnguyen/oidc-provider

Version:

OAuth 2.0 Authorization Server implementation for Node.js with OpenID Connect

74 lines (67 loc) 2.66 kB
const instance = require('../helpers/weak_cache'); const ssHandler = require('../helpers/samesite_handler'); module.exports = async function sessionHandler(ctx, next) { ctx.oidc.session = new Proxy(await ctx.oidc.provider.Session.get(ctx), { set(obj, prop, value) { switch (prop) { case 'touched': Reflect.defineProperty(obj, 'touched', { writable: true, value }); break; case 'destroyed': Reflect.defineProperty(obj, 'destroyed', { configurable: false, writable: true, value }); Reflect.defineProperty(obj, 'touched', { configurable: false, writable: false, value: false }); break; case 'accountId': if (typeof value !== 'string' || !value) { throw new TypeError(`accountId must be a non-empty string, got: ${typeof value}`); } default: // eslint-disable-line no-fallthrough Reflect.set(obj, prop, value); Reflect.defineProperty(obj, 'touched', { writable: true, value: true }); } return true; }, }); try { await next(); } finally { const sessionCookieName = ctx.oidc.provider.cookieName('session'); const longRegExp = new RegExp(`^${sessionCookieName}(?:\\.legacy)?(?:\\.sig)?=`); const sAccountIdCookieName = ctx.oidc.provider.cookieName('sessionAccountId'); // refresh the session duration if ((!ctx.oidc.session.new || ctx.oidc.session.touched) && !ctx.oidc.session.destroyed) { let ttl = instance(ctx.oidc.provider).configuration('ttl.Session'); if (typeof ttl === 'function') { ttl = ttl(ctx, ctx.oidc.session); } ssHandler.set( ctx.oidc.cookies, sessionCookieName, ctx.oidc.session.id, instance(ctx.oidc.provider).configuration('cookies.long'), ); ssHandler.set( ctx.oidc.cookies, sAccountIdCookieName, ctx.oidc.session.accountId || 0, instance(ctx.oidc.provider).configuration('cookies.share'), ); await ctx.oidc.session.save(ttl); } const resCookie = ctx.response.get('set-cookie'); if (resCookie && Array.isArray(resCookie) && resCookie.length > 0) { ctx.response.get('set-cookie').forEach((cookie, index, ary) => { /* eslint-disable no-param-reassign */ if ( !cookie.includes('expires=Thu, 01 Jan 1970') && cookie.match(longRegExp) && !ctx.oidc.session.transient && ctx.oidc.session.exp ) { ary[index] += `; expires=${new Date(ctx.oidc.session.exp * 1000).toUTCString()}`; } /* eslint-enable */ }); } } };