refactor(auth): remove agent user header

This commit is contained in:
2026-06-12 10:18:41 +08:00
parent 877b79ada8
commit bb7311589c
8 changed files with 30 additions and 51 deletions
-4
View File
@@ -49,7 +49,6 @@ const fetchBackendChatSessions = async (): Promise<ChatSessionSummary[]> => {
const response = await apiFetch(`${config.AGENT_URL}/api/v1/agent/chat/sessions`, {
method: "GET",
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
});
if (!response.ok) {
@@ -77,7 +76,6 @@ const fetchBackendChatSession = async (sessionId: string): Promise<LoadedChatSta
{
method: "GET",
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
},
);
@@ -123,7 +121,6 @@ const updateBackendChatSessionTitle = async (
is_title_manually_edited: isTitleManuallyEdited,
}),
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
},
);
@@ -138,7 +135,6 @@ const deleteBackendChatSession = async (sessionId: string) => {
{
method: "DELETE",
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
},
);
@@ -456,6 +456,21 @@ export const useAgentChatSession = ({
),
);
setIsStreaming(false);
} else if (event.type === "auth_required") {
setMessages((prev) =>
prev.map((message) =>
message.id === assistantMessageId
? {
...message,
content: message.content || `⚠️ **${event.message}**`,
isError: true,
progress: completeRunningProgress(message.progress),
todos: cancelRunningTodos(message.todos),
}
: message,
),
);
setIsStreaming(false);
}
},
[
@@ -168,7 +168,6 @@ export const useToolbarChatActions = ({
{
method: "GET",
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
},
);
-27
View File
@@ -49,30 +49,3 @@ export const getAccessToken = async () => {
}
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;
};
-1
View File
@@ -43,7 +43,6 @@ describe("fetchAgentModels", () => {
expect.objectContaining({
method: "GET",
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
}),
);
-1
View File
@@ -50,7 +50,6 @@ export const fetchAgentModels = async (): Promise<AgentModelConfig> => {
const response = await apiFetch(`${config.AGENT_URL}/api/v1/agent/chat/models`, {
method: "GET",
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
});
if (!response.ok) {
+14 -7
View File
@@ -84,6 +84,12 @@ export type StreamEvent =
detail?: string;
totalDurationMs?: number;
}
| {
type: "auth_required";
sessionId?: string;
reason?: string;
message: string;
}
| {
type: "tool_call";
sessionId: string;
@@ -303,6 +309,7 @@ const emitParsedStreamEvent = (
rejected?: boolean;
message_id?: string;
todos?: unknown;
reason?: string;
};
if (event === "state") {
onEvent({
@@ -352,6 +359,13 @@ const emitParsedStreamEvent = (
detail: parsed.detail,
totalDurationMs: parsed.total_duration_ms,
});
} else if (event === "auth_required") {
onEvent({
type: "auth_required",
sessionId: parsed.session_id,
reason: parsed.reason,
message: parsed.message ?? "登录态已过期,请刷新登录后重试",
});
} else if (event === "tool_call") {
onEvent({
type: "tool_call",
@@ -478,7 +492,6 @@ export const streamAgentChat = async ({
approval_mode: approvalMode,
}),
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
},
);
@@ -530,7 +543,6 @@ export const resumeAgentChatStream = async ({
Accept: "text/event-stream",
},
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
},
);
@@ -573,7 +585,6 @@ export const abortAgentChat = async (sessionId?: string) => {
session_id: sessionId,
}),
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
});
@@ -600,7 +611,6 @@ export const replyAgentPermission = async (
reply,
}),
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
},
);
@@ -628,7 +638,6 @@ export const replyAgentQuestion = async (
answers,
}),
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
},
);
@@ -654,7 +663,6 @@ export const rejectAgentQuestion = async (
session_id: sessionId,
}),
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
},
);
@@ -676,7 +684,6 @@ export const forkAgentChat = async (sessionId: string | undefined, keepMessageCo
keep_message_count: keepMessageCount,
}),
projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true,
});
+1 -10
View File
@@ -1,14 +1,12 @@
import { getAccessToken, getUserId } from "@/lib/authToken";
import { getAccessToken } from "@/lib/authToken";
import { useProjectStore } from "@/store/projectStore";
export type AuthHeaderMode = "include" | "omit";
export type ProjectHeaderMode = "auto" | "include" | "omit";
export type UserHeaderMode = "include" | "omit";
export interface AuthContextHeaderOptions {
authHeaderMode?: AuthHeaderMode;
projectHeaderMode?: ProjectHeaderMode;
userHeaderMode?: UserHeaderMode;
}
const shouldIncludeProjectHeader = (
@@ -36,13 +34,6 @@ export const applyAuthContextHeaders = async (
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;
if (
projectId &&