From 7f44df42e73bc83c0694139cc57af73a7ed740f7 Mon Sep 17 00:00:00 2001 From: Sebastian Seedorf Date: Thu, 19 Nov 2020 20:31:17 +0100 Subject: [PATCH] Cache user info until expire --- out/auth-proxy.js | 13 ++++++++++++- src/auth-proxy.ts | 13 ++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/out/auth-proxy.js b/out/auth-proxy.js index 4045013..dbbdb8c 100644 --- a/out/auth-proxy.js +++ b/out/auth-proxy.js @@ -12,19 +12,30 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.AuthProxy = void 0; const _1 = require("."); const node_fetch_1 = require("node-fetch"); +const cachedUsers = {}; const router = (req, res, next) => { const resolvable = new _1.Resolvable(() => __awaiter(void 0, void 0, void 0, function* () { if (!_1.DefaultConfig.USERINFO_HEADER) { return undefined; } const token = req.header(_1.DefaultConfig.USERINFO_HEADER); + if (token && cachedUsers[token]) + return cachedUsers[token]; const url = _1.DefaultConfig.AUTH_PROXY_USERINFO_URL; if (token === undefined || url === undefined) { return undefined; } 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]] }); - return yield res.json(); + const userinfo = yield res.json(); + if (expiresIn) { + cachedUsers[token] = userinfo; + setTimeout(() => delete cachedUsers[token], expiresIn); + } + return userinfo; } catch (e) { _1.Logger.warn(e); diff --git a/src/auth-proxy.ts b/src/auth-proxy.ts index 117a633..7d9bfc9 100644 --- a/src/auth-proxy.ts +++ b/src/auth-proxy.ts @@ -2,19 +2,30 @@ 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]]}); - 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) { Logger.warn(e); return undefined;