oidc-provider
Version:
OAuth 2.0 Authorization Server implementation for Node.js with OpenID Connect
69 lines (61 loc) • 2.29 kB
JavaScript
import instance from '../helpers/weak_cache.js';
export default 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}(?:\\.sig)?=`);
// 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);
}
ctx.oidc.cookies.set(
sessionCookieName,
ctx.oidc.session.id,
instance(ctx.oidc.provider).configuration.cookies.long,
);
await ctx.oidc.session.save(ttl);
}
let setCookie = ctx.response.get('set-cookie');
if (setCookie) {
if (typeof setCookie === 'string') {
setCookie = [setCookie];
}
setCookie.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 */
});
}
}
}