Allow remote header overrides and fix display issues with log

This commit is contained in:
Owen
2026-08-12 15:54:22 -04:00
parent 47ae017f94
commit 653dd920ad
10 changed files with 213 additions and 133 deletions
+20 -10
View File
@@ -180,15 +180,16 @@ export function applyRequestUserHeaders(
if (!requestUser) {
return;
}
headers["Remote-User"] = requestUser.username;
const remoteHeaders = config.getRawConfig().server.remote_headers;
headers[remoteHeaders.user] = requestUser.username;
if (requestUser.email) {
headers["Remote-Email"] = requestUser.email;
headers[remoteHeaders.email] = requestUser.email;
}
if (requestUser.name) {
headers["Remote-Name"] = requestUser.name;
headers[remoteHeaders.name] = requestUser.name;
}
if (requestUser.role) {
headers["Remote-Role"] = requestUser.role;
headers[remoteHeaders.role] = requestUser.role;
}
}
@@ -236,14 +237,20 @@ async function resolveRequestUser(
// Public inference: identity comes from Badger via Remote-* only when the
// Traefik trust header proves the request passed verify-session (VAK).
if (isAiGatewayTrustHeaderValid(req.headers as Record<string, string>)) {
const remoteHeaders = config.getRawConfig().server.remote_headers;
const virtualApiKeyId =
getRequestHeader(req, "remote-virtual-api-key-id") || null;
const userId = getRequestHeader(req, "remote-user-id");
getRequestHeader(req, remoteHeaders.virtual_api_key_id) || null;
const userId = getRequestHeader(req, remoteHeaders.user_id);
logger.debug("+++++++AI gateway request identity from trust header", {
virtualApiKeyId,
userId
});
if (userId) {
const username = getRequestHeader(req, "remote-user") || userId;
const email = getRequestHeader(req, "remote-email");
const name = getRequestHeader(req, "remote-name");
const role = getRequestHeader(req, "remote-role");
const username =
getRequestHeader(req, remoteHeaders.user) || userId;
const email = getRequestHeader(req, remoteHeaders.email);
const name = getRequestHeader(req, remoteHeaders.name);
const role = getRequestHeader(req, remoteHeaders.role);
const orgRoles = orgId ? await getUserOrgRoles(userId, orgId) : [];
return {
@@ -742,6 +749,9 @@ export async function handleAiGatewayProxy(
}
logger.info(`AI gateway ${capability} request for host: ${host}`);
logger.debug("AI gateway request headers", {
headers: req.headers
});
const target = await resolveTarget(host);
if (!target) {
@@ -68,7 +68,27 @@ export async function traefikConfigProvider(
resourceSessionRequestParam:
config.getRawConfig().server
.resource_session_request_param
.resource_session_request_param,
remoteUserIdHeader:
config.getRawConfig().server.remote_headers
.user_id,
remoteVirtualApiKeyIdHeader:
config.getRawConfig().server.remote_headers
.virtual_api_key_id,
remoteUserHeader:
config.getRawConfig().server.remote_headers.user,
remoteEmailHeader:
config.getRawConfig().server.remote_headers.email,
remoteNameHeader:
config.getRawConfig().server.remote_headers.name,
remoteRoleHeader:
config.getRawConfig().server.remote_headers.role
}
}
};
@@ -3,6 +3,7 @@ import { z } from "zod";
import {
db,
resources,
users,
virtualApiKeyResources,
virtualApiKeys,
type VirtualApiKey
@@ -152,9 +153,24 @@ export async function listMyVirtualApiKeys(
resourceName = resource.name;
}
const [user] = await db
.select()
.from(users)
.where(eq(users.userId, userId))
.limit(1);
if (!user) {
return next(
createHttpError(
HttpCode.NOT_FOUND,
`User with ID ${userId} not found`
)
);
}
const { key: userKeyRow } = await getOrCreateUserVirtualApiKey({
orgId,
userId,
user,
createdByUserId: userId
});