refactor(auth): remove agent user header
This commit is contained in:
@@ -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,
|
||||
},
|
||||
);
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -43,7 +43,6 @@ describe("fetchAgentModels", () => {
|
||||
expect.objectContaining({
|
||||
method: "GET",
|
||||
projectHeaderMode: "include",
|
||||
userHeaderMode: "include",
|
||||
skipAuthRedirect: true,
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -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
@@ -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,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 &&
|
||||
|
||||
Reference in New Issue
Block a user