Cache user info until expire

This commit is contained in:
Sebastian Seedorf
2020-11-19 20:31:17 +01:00
parent e2662b1c3b
commit 7f44df42e7
2 changed files with 24 additions and 2 deletions

View File

@@ -12,19 +12,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.AuthProxy = void 0; exports.AuthProxy = void 0;
const _1 = require("."); const _1 = require(".");
const node_fetch_1 = require("node-fetch"); const node_fetch_1 = require("node-fetch");
const cachedUsers = {};
const router = (req, res, next) => { const router = (req, res, next) => {
const resolvable = new _1.Resolvable(() => __awaiter(void 0, void 0, void 0, function* () { const resolvable = new _1.Resolvable(() => __awaiter(void 0, void 0, void 0, function* () {
if (!_1.DefaultConfig.USERINFO_HEADER) { if (!_1.DefaultConfig.USERINFO_HEADER) {
return undefined; return undefined;
} }
const token = req.header(_1.DefaultConfig.USERINFO_HEADER); const token = req.header(_1.DefaultConfig.USERINFO_HEADER);
if (token && cachedUsers[token])
return cachedUsers[token];
const url = _1.DefaultConfig.AUTH_PROXY_USERINFO_URL; const url = _1.DefaultConfig.AUTH_PROXY_USERINFO_URL;
if (token === undefined || url === undefined) { if (token === undefined || url === undefined) {
return undefined; return undefined;
} }
try { try {
const expireHeader = req.header(_1.DefaultConfig.EXPIRE_HEADER);
const expireSecDate = expireHeader && parseInt(expireHeader, 10) || undefined;
const expiresIn = expireSecDate && expireSecDate * 1000 > Date.now() && expireSecDate * 1000 - Date.now();
const res = yield node_fetch_1.default(url, { headers: [[_1.DefaultConfig.USERINFO_HEADER, token]] }); const res = yield node_fetch_1.default(url, { headers: [[_1.DefaultConfig.USERINFO_HEADER, token]] });
return yield res.json(); const userinfo = yield res.json();
if (expiresIn) {
cachedUsers[token] = userinfo;
setTimeout(() => delete cachedUsers[token], expiresIn);
}
return userinfo;
} }
catch (e) { catch (e) {
_1.Logger.warn(e); _1.Logger.warn(e);

View File

@@ -2,19 +2,30 @@ import {Request, RequestHandler} from 'express';
import {DefaultConfig, Logger, Resolvable, UserInfo} from '.'; import {DefaultConfig, Logger, Resolvable, UserInfo} from '.';
import fetch from 'node-fetch'; import fetch from 'node-fetch';
const cachedUsers: {[token: string]: UserInfo} = {};
const router: RequestHandler = (req: Request, res, next) => { const router: RequestHandler = (req: Request, res, next) => {
const resolvable = new Resolvable(async () => { const resolvable = new Resolvable(async () => {
if (!DefaultConfig.USERINFO_HEADER) { if (!DefaultConfig.USERINFO_HEADER) {
return undefined; return undefined;
} }
const token = req.header(DefaultConfig.USERINFO_HEADER); const token = req.header(DefaultConfig.USERINFO_HEADER);
if (token && cachedUsers[token]) return cachedUsers[token];
const url = DefaultConfig.AUTH_PROXY_USERINFO_URL; const url = DefaultConfig.AUTH_PROXY_USERINFO_URL;
if (token === undefined || url === undefined) { if (token === undefined || url === undefined) {
return undefined; return undefined;
} }
try { 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 res = await fetch(url, {headers: [[DefaultConfig.USERINFO_HEADER, token]]});
return await res.json() as UserInfo; const userinfo = await res.json() as UserInfo;
if (expiresIn) {
cachedUsers[token] = userinfo;
setTimeout(() => delete cachedUsers[token], expiresIn);
}
return userinfo;
} catch (e) { } catch (e) {
Logger.warn(e); Logger.warn(e);
return undefined; return undefined;