You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.7 KiB
98 lines
2.7 KiB
'use strict';
|
|
|
|
function normalizeToken(value) {
|
|
return String(value || '').trim();
|
|
}
|
|
|
|
function getToken(ctx) {
|
|
const query = ctx?.query || ctx?.request?.query || {};
|
|
const header = ctx?.header || ctx?.headers || ctx?.request?.header || ctx?.request?.headers || {};
|
|
const authHeader = normalizeToken(header.authorization || header.Authorization);
|
|
if (authHeader) {
|
|
return normalizeToken(authHeader.replace(/^Bearer\s+/i, ''));
|
|
}
|
|
if (header.token) return normalizeToken(header.token);
|
|
if (query.token) return normalizeToken(query.token);
|
|
return '';
|
|
}
|
|
|
|
function getVerifyTokenPaths(ctx) {
|
|
const configuredPath = ctx?.app?.fs?.config?.tenderUser?.aiCenter?.verifyTokenPath || '/verify-token';
|
|
return String(configuredPath || '').trim() || '/verify-token';
|
|
}
|
|
|
|
function resolveCenterVerifyUser(centerResponse) {
|
|
if (!centerResponse || typeof centerResponse !== 'object') return null;
|
|
const userInfo = centerResponse?.AIUserInfo
|
|
|| centerResponse?.data?.AIUserInfo
|
|
|| centerResponse?.userInfo
|
|
|| centerResponse?.data?.userInfo
|
|
|| centerResponse?.data
|
|
|| centerResponse;
|
|
if (!userInfo || typeof userInfo !== 'object') return null;
|
|
const userId = String(
|
|
userInfo?.pepUserId
|
|
|| userInfo?.pep_user_id
|
|
|| userInfo?.pepId
|
|
|| userInfo?.pep_id
|
|
|| userInfo?.id
|
|
|| userInfo?.userId
|
|
|| '',
|
|
).trim();
|
|
if (!userId) return null;
|
|
return userInfo;
|
|
}
|
|
|
|
async function verifyByAiCenter(ctx, token) {
|
|
const centerRequest = ctx?.app?.fs?.centerRequest;
|
|
if (!centerRequest) {
|
|
return null;
|
|
}
|
|
|
|
const path = getVerifyTokenPaths(ctx);
|
|
try {
|
|
const centerResponse = await centerRequest.get(path, { query: { token } });
|
|
const userInfo = resolveCenterVerifyUser(centerResponse);
|
|
if (userInfo) {
|
|
return userInfo;
|
|
}
|
|
} catch (error) {
|
|
const logger = ctx.fs?.logger || ctx.logger || console;
|
|
logger.warn(`[AUTH] Center token verify failed on ${path}: ${error?.message || error}`);
|
|
return null;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
module.exports = async (ctx, next) => {
|
|
ctx.fs = ctx.fs || {};
|
|
const { path } = ctx;
|
|
if (path) {
|
|
try {
|
|
const token = getToken(ctx);
|
|
|
|
if (!token) {
|
|
ctx.throw(401, 'Unauthorized');
|
|
return;
|
|
}
|
|
|
|
const userInfo = await verifyByAiCenter(ctx, token);
|
|
|
|
if (!userInfo) {
|
|
ctx.throw(401, 'Unauthorized');
|
|
return;
|
|
}
|
|
|
|
ctx.fs.curUser = {
|
|
token,
|
|
userInfo,
|
|
};
|
|
await next();
|
|
} catch (error) {
|
|
ctx.logger.error(error);
|
|
ctx.throw(error.status || 401, error.message || error);
|
|
}
|
|
} else {
|
|
await next();
|
|
}
|
|
}
|
|
|