增加获取用户 ID 的功能,Agent chat 请求头新增传递 userId
Build Push and Deploy / docker-image (push) Successful in 1m12s
Build Push and Deploy / deploy-fallback-log (push) Has been skipped

This commit is contained in:
2026-05-11 16:37:55 +08:00
parent 133f5d417f
commit 536cd6a5d1
3 changed files with 40 additions and 1 deletions
+27
View File
@@ -49,3 +49,30 @@ export const getAccessToken = async () => {
} }
return null; return null;
}; };
export const getUserId = async () => {
const session = await getSession();
const sessionUserId = typeof session?.user?.id === "string" ? session.user.id : null;
if (sessionUserId) {
return sessionUserId;
}
const accessToken = await getAccessToken();
if (!accessToken) {
return null;
}
const payload = decodeJwtPayload(accessToken);
if (!payload || typeof payload !== "object") {
return null;
}
const candidate =
typeof payload.sub === "string"
? payload.sub
: typeof payload.user_id === "string"
? payload.user_id
: null;
return candidate;
};
+3
View File
@@ -99,6 +99,7 @@ export const streamAgentChat = async ({
session_id: sessionId, session_id: sessionId,
}), }),
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}, },
); );
@@ -229,6 +230,7 @@ export const abortAgentChat = async (sessionId?: string) => {
session_id: sessionId, session_id: sessionId,
}), }),
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}); });
@@ -249,6 +251,7 @@ export const forkAgentChat = async (sessionId: string | undefined, keepMessageCo
keep_message_count: keepMessageCount, keep_message_count: keepMessageCount,
}), }),
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}); });
+10 -1
View File
@@ -1,12 +1,14 @@
import { getAccessToken } from "@/lib/authToken"; import { getAccessToken, getUserId } from "@/lib/authToken";
import { useProjectStore } from "@/store/projectStore"; import { useProjectStore } from "@/store/projectStore";
export type AuthHeaderMode = "include" | "omit"; export type AuthHeaderMode = "include" | "omit";
export type ProjectHeaderMode = "auto" | "include" | "omit"; export type ProjectHeaderMode = "auto" | "include" | "omit";
export type UserHeaderMode = "include" | "omit";
export interface AuthContextHeaderOptions { export interface AuthContextHeaderOptions {
authHeaderMode?: AuthHeaderMode; authHeaderMode?: AuthHeaderMode;
projectHeaderMode?: ProjectHeaderMode; projectHeaderMode?: ProjectHeaderMode;
userHeaderMode?: UserHeaderMode;
} }
const shouldIncludeProjectHeader = ( const shouldIncludeProjectHeader = (
@@ -34,6 +36,13 @@ export const applyAuthContextHeaders = async (
headers.set("Authorization", `Bearer ${accessToken}`); headers.set("Authorization", `Bearer ${accessToken}`);
} }
if (options.userHeaderMode === "include") {
const userId = await getUserId();
if (userId) {
headers.set("X-User-Id", userId);
}
}
const projectId = useProjectStore.getState().currentProjectId; const projectId = useProjectStore.getState().currentProjectId;
if ( if (
projectId && projectId &&