























@@ -145,9 +145,18 @@ export function registerAuthModesSuite(): void {
145145describe("tailscale auth", () => {
146146let server: Awaited<ReturnType<typeof startGatewayServer>>;
147147let port: number;
148+const tailscaleOrigin = "https://gateway.tailnet.ts.net";
148149149150beforeAll(async () => {
150151testState.gatewayAuth = { mode: "token", token: "secret", allowTailscale: true };
152+testState.gatewayControlUi = { allowedOrigins: [tailscaleOrigin] };
153+const { writeConfigFile } = await import("../config/config.js");
154+await writeConfigFile({
155+gateway: {
156+auth: testState.gatewayAuth,
157+controlUi: testState.gatewayControlUi,
158+},
159+});
151160port = await getFreePort();
152161server = await startGatewayServer(port);
153162});
@@ -158,6 +167,7 @@ export function registerAuthModesSuite(): void {
158167159168beforeEach(() => {
160169testState.gatewayAuth = { mode: "token", token: "secret", allowTailscale: true };
170+testState.gatewayControlUi = { allowedOrigins: [tailscaleOrigin] };
161171testTailscaleWhois.value = { login: "peter", name: "Peter" };
162172});
163173@@ -173,6 +183,20 @@ export function registerAuthModesSuite(): void {
173183ws.close();
174184});
175185186+test("skips pairing for tailscale-authenticated control ui with device identity", async () => {
187+const ws = await openTailscaleWs(port, { origin: tailscaleOrigin });
188+const res = await connectReq(ws, {
189+skipDefaultAuth: true,
190+client: {
191+ ...CONTROL_UI_CLIENT,
192+},
193+});
194+expect(res.ok, JSON.stringify(res)).toBe(true);
195+const status = await rpcReq(ws, "status");
196+expect(status.ok).toBe(true);
197+ws.close();
198+});
199+176200test("connects with shared token but clears scopes when tailscale auth skips device", async () => {
177201const ws = await openTailscaleWs(port);
178202const res = await connectReq(ws, { token: "secret", device: null });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。