ai-query对接新版freesun-agent接口的分支
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

'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();
}
}