Cache user info until expire
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user