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