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`, { const response = await apiFetch(`${config.AGENT_URL}/api/v1/agent/chat/sessions`, {
method: "GET", method: "GET",
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}); });
if (!response.ok) { if (!response.ok) {
@@ -77,7 +76,6 @@ const fetchBackendChatSession = async (sessionId: string): Promise<LoadedChatSta
{ {
method: "GET", method: "GET",
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}, },
); );
@@ -123,7 +121,6 @@ const updateBackendChatSessionTitle = async (
is_title_manually_edited: isTitleManuallyEdited, is_title_manually_edited: isTitleManuallyEdited,
}), }),
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}, },
); );
@@ -138,7 +135,6 @@ const deleteBackendChatSession = async (sessionId: string) => {
{ {
method: "DELETE", method: "DELETE",
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}, },
); );
@@ -456,6 +456,21 @@ export const useAgentChatSession = ({
), ),
); );
setIsStreaming(false); 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", method: "GET",
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}, },
); );
-27
View File
@@ -49,30 +49,3 @@ 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;
};
-1
View File
@@ -43,7 +43,6 @@ describe("fetchAgentModels", () => {
expect.objectContaining({ expect.objectContaining({
method: "GET", method: "GET",
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, 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`, { const response = await apiFetch(`${config.AGENT_URL}/api/v1/agent/chat/models`, {
method: "GET", method: "GET",
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}); });
if (!response.ok) { if (!response.ok) {
+14 -7
View File
@@ -84,6 +84,12 @@ export type StreamEvent =
detail?: string; detail?: string;
totalDurationMs?: number; totalDurationMs?: number;
} }
| {
type: "auth_required";
sessionId?: string;
reason?: string;
message: string;
}
| { | {
type: "tool_call"; type: "tool_call";
sessionId: string; sessionId: string;
@@ -303,6 +309,7 @@ const emitParsedStreamEvent = (
rejected?: boolean; rejected?: boolean;
message_id?: string; message_id?: string;
todos?: unknown; todos?: unknown;
reason?: string;
}; };
if (event === "state") { if (event === "state") {
onEvent({ onEvent({
@@ -352,6 +359,13 @@ const emitParsedStreamEvent = (
detail: parsed.detail, detail: parsed.detail,
totalDurationMs: parsed.total_duration_ms, 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") { } else if (event === "tool_call") {
onEvent({ onEvent({
type: "tool_call", type: "tool_call",
@@ -478,7 +492,6 @@ export const streamAgentChat = async ({
approval_mode: approvalMode, approval_mode: approvalMode,
}), }),
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}, },
); );
@@ -530,7 +543,6 @@ export const resumeAgentChatStream = async ({
Accept: "text/event-stream", Accept: "text/event-stream",
}, },
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}, },
); );
@@ -573,7 +585,6 @@ export const abortAgentChat = async (sessionId?: string) => {
session_id: sessionId, session_id: sessionId,
}), }),
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}); });
@@ -600,7 +611,6 @@ export const replyAgentPermission = async (
reply, reply,
}), }),
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}, },
); );
@@ -628,7 +638,6 @@ export const replyAgentQuestion = async (
answers, answers,
}), }),
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}, },
); );
@@ -654,7 +663,6 @@ export const rejectAgentQuestion = async (
session_id: sessionId, session_id: sessionId,
}), }),
projectHeaderMode: "include", projectHeaderMode: "include",
userHeaderMode: "include",
skipAuthRedirect: true, skipAuthRedirect: true,
}, },
); );
@@ -676,7 +684,6 @@ 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,
}); });
+1 -10
View File
@@ -1,14 +1,12 @@
import { getAccessToken, getUserId } from "@/lib/authToken"; import { getAccessToken } 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 = (
@@ -36,13 +34,6 @@ 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 &&