Files
node-pkg-express-utils/src/auth-proxy.ts
2020-11-19 20:33:07 +01:00

50 lines
1.5 KiB
TypeScript

import {Request, RequestHandler} from 'express';
import {DefaultConfig, Logger, Resolvable, UserInfo} from '.';
import fetch from 'node-fetch';
const cachedUsers: {[token: string]: UserInfo} = {};
const router: RequestHandler = (req: Request, res, next) => {
const resolvable = new Resolvable(async () => {
if (!DefaultConfig.USERINFO_HEADER) {
return undefined;
}
const token = req.header(DefaultConfig.USERINFO_HEADER);
if (token && cachedUsers[token]) return cachedUsers[token];
const url = DefaultConfig.AUTH_PROXY_USERINFO_URL;
if (token === undefined || url === undefined) {
return undefined;
}
try {
const expireHeader = req.header(DefaultConfig.EXPIRE_HEADER);
const expireSecDate = expireHeader && parseInt(expireHeader, 10) || undefined;
const expiresIn = expireSecDate && expireSecDate * 1000 > Date.now() && expireSecDate * 1000 - Date.now();
const res = await fetch(url, {headers: [[DefaultConfig.USERINFO_HEADER, token]]});
const userinfo = await res.json() as UserInfo;
if (expiresIn) {
cachedUsers[token] = userinfo;
setTimeout(() => delete cachedUsers[token], expiresIn);
}
return userinfo;
} catch (e) {
Logger.warn(e);
return undefined;
}
});
req.getUserInfo = () => resolvable.resolve();
res.initLogout = function() {
const url = DefaultConfig.AUTH_PROXY_INIT_LOGOUT_URL;
if (url === undefined) {
return false;
}
this.redirect(307, url);
return true;
};
next();
};
export const AuthProxy = {
router,
};