fix MCP auth token refresh and disable legacy SSE

This commit is contained in:
Jordan Diaz
2026-07-18 10:03:12 +00:00
parent 9c3d9fb999
commit 987e050539
12 changed files with 437 additions and 128 deletions

View File

@@ -0,0 +1,65 @@
import assert from "node:assert/strict";
import test from "node:test";
import { createMcpAuthMiddleware } from "../auth/mcpAuthMiddleware.js";
async function invoke(middleware, headers = {}, path = "/mcp") {
const req = { headers: { ...headers }, path };
const response = {};
const res = {
status(code) { response.status = code; return this; },
setHeader() { return this; },
end(body) { response.body = JSON.parse(body); return this; },
};
let nextCalled = false;
await middleware(req, res, () => { nextCalled = true; });
return { req, response, nextCalled };
}
test("rejects missing and invalid MCP secrets", async () => {
const middleware = createMcpAuthMiddleware({ validateToken: async () => null });
assert.equal((await invoke(middleware)).response.status, 401);
assert.equal((await invoke(middleware, { "x-mcp-secret": "bad" })).response.status, 401);
});
test("replaces spoofed identity and enforces project scope", async () => {
const middleware = createMcpAuthMiddleware({
validateToken: async () => ({ user: "owner", project: "allowed" }),
});
const result = await invoke(middleware, {
"x-mcp-secret": "valid",
"x-acai-user": "attacker",
"x-project-name": "other",
});
assert.equal(result.nextCalled, true);
assert.equal(result.req.headers["x-acai-user"], "owner");
assert.equal(result.req.headers["x-project-name"], "allowed");
});
test("requires project context for user-wide tokens", async () => {
const middleware = createMcpAuthMiddleware({
validateToken: async () => ({ user: "owner", project: "" }),
});
assert.equal((await invoke(middleware, { "x-mcp-secret": "valid" })).response.status, 400);
const accepted = await invoke(middleware, {
"x-mcp-secret": "valid",
"x-project-name": "demo",
});
assert.equal(accepted.nextCalled, true);
});
test("revocation is effective on the next request in an existing session", async () => {
let revoked = false;
const middleware = createMcpAuthMiddleware({
validateToken: async () => revoked ? null : ({ user: "owner", project: "demo" }),
});
const headers = { "x-mcp-secret": "valid", "x-project-name": "demo" };
assert.equal((await invoke(middleware, headers)).nextCalled, true);
revoked = true;
assert.equal((await invoke(middleware, headers)).response.status, 401);
});
test("does not apply MCP auth to legacy SSE paths", async () => {
const middleware = createMcpAuthMiddleware({ validateToken: async () => null });
assert.equal((await invoke(middleware, { "x-acai-user": "legacy" }, "/sse")).nextCalled, true);
});