swallowkit 1.0.0-beta.54 → 1.0.0-beta.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/scaffold/auth-generator.d.ts +1 -1
- package/dist/core/scaffold/auth-generator.d.ts.map +1 -1
- package/dist/core/scaffold/auth-generator.js +84 -25
- package/dist/core/scaffold/auth-generator.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/bff-swa-auth.test.ts +275 -0
- package/src/__tests__/multi-auth.test.ts +1 -1
- package/src/core/scaffold/auth-generator.ts +95 -33
|
@@ -23,7 +23,7 @@ export declare function generateProxy(projectName: string): string;
|
|
|
23
23
|
export declare function generateLoginPage(): string;
|
|
24
24
|
export declare function generateAuthContext(): string;
|
|
25
25
|
export declare function generateBFFCallFunctionWithAuth(): string;
|
|
26
|
-
/** SWA built-in auth variant: forward only a
|
|
26
|
+
/** SWA built-in auth variant: forward only a validated SWA client principal. */
|
|
27
27
|
export declare function generateBFFCallFunctionWithSwaAuth(): string;
|
|
28
28
|
/** Combined transport for named schemes. Functions still performs all verification. */
|
|
29
29
|
export declare function generateBFFCallFunctionWithMultipleAuth(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-generator.d.ts","sourceRoot":"","sources":["../../../src/core/scaffold/auth-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEvH,KAAK,WAAW,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;AAElD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CA+C9E;AAUD,wBAAgB,wCAAwC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAe/E;AAED,wBAAgB,wCAAwC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAU/E;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAmElF;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CA6ClF;AAMD,wBAAgB,kBAAkB,IAAI,MAAM,CA8B3C;AAMD,wBAAgB,uBAAuB,CACrC,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,WAAW,GACpB,MAAM,CA8IR;AAMD,wBAAgB,mBAAmB,IAAI,MAAM,CAwE5C;AAMD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,WAAW,GACpB,MAAM,CA+HR;AAMD,wBAAgB,uBAAuB,IAAI,MAAM,CA+GhD;AAMD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,WAAW,GACpB,MAAM,CAiJR;AAMD,wBAAgB,uBAAuB,IAAI,MAAM,CAyEhD;AAMD,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAuChG;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAUtE;AAED,wBAAgB,sBAAsB,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,CA+B1E;AAMD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAoDzD;AAMD,wBAAgB,iBAAiB,IAAI,MAAM,CA0F1C;AAMD,wBAAgB,mBAAmB,IAAI,MAAM,CA+F5C;AAMD,wBAAgB,+BAA+B,IAAI,MAAM,CA+HxD;
|
|
1
|
+
{"version":3,"file":"auth-generator.d.ts","sourceRoot":"","sources":["../../../src/core/scaffold/auth-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1421,50 +1421,109 @@ export async function callFunction<TInput = any, TOutput = any>(
|
|
|
1421
1421
|
}
|
|
1422
1422
|
`;
|
|
1423
1423
|
}
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
.
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1424
|
+
function generateBFFSwaCredentialForwarding(includeBearer) {
|
|
1425
|
+
const bearerForwarding = includeBearer
|
|
1426
|
+
? ` const authorization = reqHeaders.get('authorization');
|
|
1427
|
+
if (authorization?.startsWith('Bearer ')) {
|
|
1428
|
+
fetchHeaders.Authorization = authorization;
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
`
|
|
1432
|
+
: "";
|
|
1433
|
+
return `${bearerForwarding} let principal = reqHeaders.get('x-ms-client-principal');
|
|
1434
|
+
|
|
1435
|
+
if (!principal) {
|
|
1434
1436
|
const cookie = reqHeaders.get('cookie');
|
|
1435
|
-
const
|
|
1437
|
+
const forwardedHost = reqHeaders.get('x-forwarded-host');
|
|
1438
|
+
const requestHost = reqHeaders.get('host');
|
|
1439
|
+
const host = (forwardedHost || requestHost)?.split(',')[0].trim();
|
|
1440
|
+
|
|
1436
1441
|
if (cookie && host) {
|
|
1437
|
-
const
|
|
1442
|
+
const forwardedProto = reqHeaders.get('x-forwarded-proto');
|
|
1443
|
+
const proto =
|
|
1444
|
+
forwardedProto?.split(',')[0].trim() ||
|
|
1445
|
+
(isLocalFunctionsUrl(functionsBaseUrl) ? 'http' : 'https');
|
|
1446
|
+
|
|
1438
1447
|
const meResponse = await fetch(\`\${proto}://\${host}/.auth/me\`, {
|
|
1439
1448
|
headers: { cookie },
|
|
1440
1449
|
cache: 'no-store',
|
|
1441
1450
|
});
|
|
1451
|
+
|
|
1442
1452
|
if (meResponse.ok) {
|
|
1443
|
-
const payload = await meResponse.json() as {
|
|
1453
|
+
const payload = (await meResponse.json()) as {
|
|
1454
|
+
clientPrincipal?: unknown;
|
|
1455
|
+
};
|
|
1456
|
+
|
|
1444
1457
|
if (payload.clientPrincipal) {
|
|
1445
|
-
principal = Buffer.from(
|
|
1458
|
+
principal = Buffer.from(
|
|
1459
|
+
JSON.stringify(payload.clientPrincipal),
|
|
1460
|
+
'utf8'
|
|
1461
|
+
).toString('base64');
|
|
1446
1462
|
}
|
|
1447
1463
|
}
|
|
1448
1464
|
}
|
|
1449
1465
|
}
|
|
1466
|
+
|
|
1450
1467
|
if (principal) {
|
|
1451
|
-
const
|
|
1468
|
+
const decodedPrincipal = Buffer.from(principal, 'base64');
|
|
1469
|
+
if (decodedPrincipal.toString('base64') !== principal) {
|
|
1470
|
+
throw new Error('Invalid SWA client principal encoding');
|
|
1471
|
+
}
|
|
1472
|
+
const parsed = JSON.parse(
|
|
1473
|
+
decodedPrincipal.toString('utf8')
|
|
1474
|
+
) as Record<string, unknown>;
|
|
1475
|
+
|
|
1452
1476
|
const normalized = {
|
|
1453
|
-
identityProvider:
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1477
|
+
identityProvider:
|
|
1478
|
+
typeof parsed.identityProvider === 'string'
|
|
1479
|
+
? parsed.identityProvider
|
|
1480
|
+
: '',
|
|
1481
|
+
userId: typeof parsed.userId === 'string' ? parsed.userId : '',
|
|
1482
|
+
userDetails:
|
|
1483
|
+
typeof parsed.userDetails === 'string'
|
|
1484
|
+
? parsed.userDetails
|
|
1485
|
+
: '',
|
|
1486
|
+
userRoles: Array.isArray(parsed.userRoles)
|
|
1487
|
+
? parsed.userRoles.filter(
|
|
1488
|
+
(role: unknown): role is string => typeof role === 'string'
|
|
1489
|
+
)
|
|
1490
|
+
: [],
|
|
1457
1491
|
};
|
|
1458
|
-
|
|
1459
|
-
|
|
1492
|
+
|
|
1493
|
+
if (
|
|
1494
|
+
normalized.identityProvider &&
|
|
1495
|
+
normalized.userId &&
|
|
1496
|
+
normalized.userRoles.includes('authenticated')
|
|
1497
|
+
) {
|
|
1498
|
+
fetchHeaders['x-ms-client-principal'] = Buffer.from(
|
|
1499
|
+
JSON.stringify(normalized),
|
|
1500
|
+
'utf8'
|
|
1501
|
+
).toString('base64');
|
|
1460
1502
|
}
|
|
1461
|
-
}
|
|
1503
|
+
}`;
|
|
1504
|
+
}
|
|
1505
|
+
function generateBFFCallFunctionWithSwaCredentials(includeBearer) {
|
|
1506
|
+
return generateBFFCallFunctionWithAuth()
|
|
1507
|
+
.replace(` // Authorization ヘッダーの転送(Proxy が cookie → Authorization に変換済み)`, ` // Forward only validated credentials from the current request.`)
|
|
1508
|
+
.replace(` const authorization = reqHeaders.get('authorization');
|
|
1509
|
+
if (authorization) {
|
|
1510
|
+
fetchHeaders['Authorization'] = authorization;
|
|
1511
|
+
}`, generateBFFSwaCredentialForwarding(includeBearer))
|
|
1512
|
+
.replace(` } catch {
|
|
1513
|
+
// headers() が使えないコンテキスト(ISR 等)では無視
|
|
1514
|
+
}`, ` } catch (error) {
|
|
1515
|
+
// Do not include credentials or request header values in authentication logs.
|
|
1516
|
+
const errorType = error instanceof Error ? error.name : 'UnknownError';
|
|
1517
|
+
console.error('[BFF] Authentication forwarding failed:', errorType);
|
|
1518
|
+
}`);
|
|
1519
|
+
}
|
|
1520
|
+
/** SWA built-in auth variant: forward only a validated SWA client principal. */
|
|
1521
|
+
function generateBFFCallFunctionWithSwaAuth() {
|
|
1522
|
+
return generateBFFCallFunctionWithSwaCredentials(false);
|
|
1462
1523
|
}
|
|
1463
1524
|
/** Combined transport for named schemes. Functions still performs all verification. */
|
|
1464
1525
|
function generateBFFCallFunctionWithMultipleAuth() {
|
|
1465
|
-
return
|
|
1466
|
-
if (authorization?.startsWith('Bearer ')) fetchHeaders['Authorization'] = authorization;
|
|
1467
|
-
// Never forward a browser-supplied principal header. Resolve it from the SWA session endpoint.`);
|
|
1526
|
+
return generateBFFCallFunctionWithSwaCredentials(true);
|
|
1468
1527
|
}
|
|
1469
1528
|
function generateSwaAuthHelperTS() {
|
|
1470
1529
|
return `import { HttpRequest, HttpResponseInit } from '@azure/functions';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-generator.js","sourceRoot":"","sources":["../../../src/core/scaffold/auth-generator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth-generator.js","sourceRoot":"","sources":["../../../src/core/scaffold/auth-generator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import {
|
|
3
|
+
generateBFFCallFunctionWithMultipleAuth,
|
|
4
|
+
generateBFFCallFunctionWithSwaAuth,
|
|
5
|
+
} from "../core/scaffold/auth-generator";
|
|
6
|
+
|
|
7
|
+
type GeneratedModule = {
|
|
8
|
+
callFunction(config: { method: "GET"; path: string }): Promise<unknown>;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
type FetchCall = {
|
|
12
|
+
url: string;
|
|
13
|
+
init: RequestInit | undefined;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const originalFetch = global.fetch;
|
|
17
|
+
const originalBaseUrl = process.env.BACKEND_FUNCTIONS_BASE_URL;
|
|
18
|
+
const originalFunctionsKey = process.env.BACKEND_FUNCTIONS_KEY;
|
|
19
|
+
|
|
20
|
+
function encodePrincipal(value: unknown): string {
|
|
21
|
+
return Buffer.from(JSON.stringify(value), "utf8").toString("base64");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function decodeForwardedPrincipal(call: FetchCall): Record<string, unknown> | undefined {
|
|
25
|
+
const value = (call.init?.headers as Record<string, string>)["x-ms-client-principal"];
|
|
26
|
+
return value
|
|
27
|
+
? JSON.parse(Buffer.from(value, "base64").toString("utf8"))
|
|
28
|
+
: undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function loadGeneratedModule(
|
|
32
|
+
code: string,
|
|
33
|
+
requestHeaders: Record<string, string>,
|
|
34
|
+
): GeneratedModule {
|
|
35
|
+
const output = ts.transpileModule(code, {
|
|
36
|
+
compilerOptions: {
|
|
37
|
+
esModuleInterop: true,
|
|
38
|
+
module: ts.ModuleKind.CommonJS,
|
|
39
|
+
target: ts.ScriptTarget.ES2020,
|
|
40
|
+
},
|
|
41
|
+
reportDiagnostics: true,
|
|
42
|
+
});
|
|
43
|
+
expect(output.diagnostics).toEqual([]);
|
|
44
|
+
|
|
45
|
+
class MockNextResponse {
|
|
46
|
+
static json(body: unknown, init?: { status?: number }) {
|
|
47
|
+
return { body, status: init?.status ?? 200 };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
constructor(
|
|
51
|
+
public body: unknown,
|
|
52
|
+
public init?: { status?: number },
|
|
53
|
+
) {}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const generatedModule = { exports: {} as GeneratedModule };
|
|
57
|
+
const mockRequire = (id: string): unknown => {
|
|
58
|
+
if (id === "next/server") return { NextResponse: MockNextResponse };
|
|
59
|
+
if (id === "next/headers") {
|
|
60
|
+
return { headers: async () => new Headers(requestHeaders) };
|
|
61
|
+
}
|
|
62
|
+
if (id === "zod/v4") return require("zod/v4");
|
|
63
|
+
throw new Error(`Unexpected generated import: ${id}`);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
new Function("require", "module", "exports", output.outputText)(
|
|
67
|
+
mockRequire,
|
|
68
|
+
generatedModule,
|
|
69
|
+
generatedModule.exports,
|
|
70
|
+
);
|
|
71
|
+
return generatedModule.exports;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function runGeneratedCall(options: {
|
|
75
|
+
code: string;
|
|
76
|
+
requestHeaders: Record<string, string>;
|
|
77
|
+
mePrincipal?: unknown;
|
|
78
|
+
functionsBaseUrl?: string;
|
|
79
|
+
}): Promise<FetchCall[]> {
|
|
80
|
+
process.env.BACKEND_FUNCTIONS_BASE_URL =
|
|
81
|
+
options.functionsBaseUrl ?? "https://functions.example.test";
|
|
82
|
+
process.env.BACKEND_FUNCTIONS_KEY = "functions-key-secret";
|
|
83
|
+
|
|
84
|
+
const calls: FetchCall[] = [];
|
|
85
|
+
global.fetch = jest.fn(async (input: string | URL | Request, init?: RequestInit) => {
|
|
86
|
+
const url = input.toString();
|
|
87
|
+
calls.push({ url, init });
|
|
88
|
+
if (url.endsWith("/.auth/me")) {
|
|
89
|
+
return {
|
|
90
|
+
ok: true,
|
|
91
|
+
status: 200,
|
|
92
|
+
json: async () => ({ clientPrincipal: options.mePrincipal }),
|
|
93
|
+
} as Response;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
ok: true,
|
|
97
|
+
status: 200,
|
|
98
|
+
json: async () => ({ ok: true }),
|
|
99
|
+
text: async () => "",
|
|
100
|
+
} as Response;
|
|
101
|
+
}) as typeof fetch;
|
|
102
|
+
|
|
103
|
+
const generated = loadGeneratedModule(options.code, options.requestHeaders);
|
|
104
|
+
await generated.callFunction({ method: "GET", path: "/api/resource" });
|
|
105
|
+
return calls;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function functionsCall(calls: FetchCall[]): FetchCall {
|
|
109
|
+
const call = calls.find(({ url }) => url.endsWith("/api/resource"));
|
|
110
|
+
expect(call).toBeDefined();
|
|
111
|
+
return call!;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
afterEach(() => {
|
|
115
|
+
global.fetch = originalFetch;
|
|
116
|
+
if (originalBaseUrl === undefined) delete process.env.BACKEND_FUNCTIONS_BASE_URL;
|
|
117
|
+
else process.env.BACKEND_FUNCTIONS_BASE_URL = originalBaseUrl;
|
|
118
|
+
if (originalFunctionsKey === undefined) delete process.env.BACKEND_FUNCTIONS_KEY;
|
|
119
|
+
else process.env.BACKEND_FUNCTIONS_KEY = originalFunctionsKey;
|
|
120
|
+
jest.restoreAllMocks();
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe("generated BFF SWA credential forwarding", () => {
|
|
124
|
+
const validPrincipal = {
|
|
125
|
+
identityProvider: "github",
|
|
126
|
+
userId: "user-123",
|
|
127
|
+
userDetails: "octocat",
|
|
128
|
+
userRoles: ["anonymous", "authenticated", 123],
|
|
129
|
+
untrustedExtra: "must-not-be-forwarded",
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
it("normalizes an incoming principal and does not call /.auth/me", async () => {
|
|
133
|
+
const calls = await runGeneratedCall({
|
|
134
|
+
code: generateBFFCallFunctionWithSwaAuth(),
|
|
135
|
+
requestHeaders: {
|
|
136
|
+
cookie: "session=cookie-secret",
|
|
137
|
+
host: "app.example.test",
|
|
138
|
+
"x-ms-client-principal": encodePrincipal(validPrincipal),
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
expect(calls.map(({ url }) => url)).not.toContain("https://app.example.test/.auth/me");
|
|
143
|
+
expect(decodeForwardedPrincipal(functionsCall(calls))).toEqual({
|
|
144
|
+
identityProvider: "github",
|
|
145
|
+
userId: "user-123",
|
|
146
|
+
userDetails: "octocat",
|
|
147
|
+
userRoles: ["anonymous", "authenticated"],
|
|
148
|
+
});
|
|
149
|
+
expect(
|
|
150
|
+
(functionsCall(calls).init?.headers as Record<string, string>)[
|
|
151
|
+
"x-functions-key"
|
|
152
|
+
],
|
|
153
|
+
).toBe("functions-key-secret");
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("uses x-forwarded-host for the /.auth/me fallback", async () => {
|
|
157
|
+
const calls = await runGeneratedCall({
|
|
158
|
+
code: generateBFFCallFunctionWithSwaAuth(),
|
|
159
|
+
requestHeaders: {
|
|
160
|
+
cookie: "session=valid",
|
|
161
|
+
host: "internal.example.test",
|
|
162
|
+
"x-forwarded-host": "public.example.test",
|
|
163
|
+
},
|
|
164
|
+
mePrincipal: validPrincipal,
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
expect(calls[0].url).toBe("https://public.example.test/.auth/me");
|
|
168
|
+
expect(decodeForwardedPrincipal(functionsCall(calls))).toEqual({
|
|
169
|
+
identityProvider: "github",
|
|
170
|
+
userId: "user-123",
|
|
171
|
+
userDetails: "octocat",
|
|
172
|
+
userRoles: ["anonymous", "authenticated"],
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it("falls back to host when x-forwarded-host is absent", async () => {
|
|
177
|
+
const calls = await runGeneratedCall({
|
|
178
|
+
code: generateBFFCallFunctionWithSwaAuth(),
|
|
179
|
+
requestHeaders: { cookie: "session=valid", host: "app.example.test" },
|
|
180
|
+
mePrincipal: validPrincipal,
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
expect(calls[0].url).toBe("https://app.example.test/.auth/me");
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it("uses the first comma-separated forwarded host and protocol", async () => {
|
|
187
|
+
const calls = await runGeneratedCall({
|
|
188
|
+
code: generateBFFCallFunctionWithSwaAuth(),
|
|
189
|
+
requestHeaders: {
|
|
190
|
+
cookie: "session=valid",
|
|
191
|
+
host: "internal.example.test",
|
|
192
|
+
"x-forwarded-host": "public.example.test, proxy.example.test",
|
|
193
|
+
"x-forwarded-proto": "http, https",
|
|
194
|
+
},
|
|
195
|
+
mePrincipal: validPrincipal,
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
expect(calls[0].url).toBe("http://public.example.test/.auth/me");
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it.each([
|
|
202
|
+
["a missing userId", { ...validPrincipal, userId: undefined }],
|
|
203
|
+
["a missing authenticated role", { ...validPrincipal, userRoles: ["anonymous"] }],
|
|
204
|
+
["a missing identityProvider", { ...validPrincipal, identityProvider: "" }],
|
|
205
|
+
])("does not forward a principal with %s", async (_case, principal) => {
|
|
206
|
+
const calls = await runGeneratedCall({
|
|
207
|
+
code: generateBFFCallFunctionWithSwaAuth(),
|
|
208
|
+
requestHeaders: { "x-ms-client-principal": encodePrincipal(principal) },
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
expect(decodeForwardedPrincipal(functionsCall(calls))).toBeUndefined();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it.each([
|
|
215
|
+
"not-base64!",
|
|
216
|
+
`${encodePrincipal(validPrincipal)}!`,
|
|
217
|
+
Buffer.from("not-json", "utf8").toString("base64"),
|
|
218
|
+
])(
|
|
219
|
+
"fails closed without logging credentials for malformed principal %s",
|
|
220
|
+
async (principal) => {
|
|
221
|
+
const error = jest.spyOn(console, "error").mockImplementation(() => undefined);
|
|
222
|
+
const cookie = "session=highly-sensitive-cookie";
|
|
223
|
+
const calls = await runGeneratedCall({
|
|
224
|
+
code: generateBFFCallFunctionWithSwaAuth(),
|
|
225
|
+
requestHeaders: { cookie, "x-ms-client-principal": principal },
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
expect(decodeForwardedPrincipal(functionsCall(calls))).toBeUndefined();
|
|
229
|
+
const logged = JSON.stringify(error.mock.calls);
|
|
230
|
+
expect(logged).not.toContain(cookie);
|
|
231
|
+
expect(logged).not.toContain(principal);
|
|
232
|
+
},
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
it("preserves Bearer and applies the same SWA rules for multiple auth", async () => {
|
|
236
|
+
const calls = await runGeneratedCall({
|
|
237
|
+
code: generateBFFCallFunctionWithMultipleAuth(),
|
|
238
|
+
requestHeaders: {
|
|
239
|
+
authorization: "Bearer line-token-secret",
|
|
240
|
+
"x-ms-client-principal": encodePrincipal(validPrincipal),
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
const headers = functionsCall(calls).init?.headers as Record<string, string>;
|
|
244
|
+
|
|
245
|
+
expect(headers.Authorization).toBe("Bearer line-token-secret");
|
|
246
|
+
expect(decodeForwardedPrincipal(functionsCall(calls))?.userId).toBe("user-123");
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it("does not add Bearer forwarding to the SWA-only variant", async () => {
|
|
250
|
+
const code = generateBFFCallFunctionWithSwaAuth();
|
|
251
|
+
const calls = await runGeneratedCall({
|
|
252
|
+
code,
|
|
253
|
+
requestHeaders: {
|
|
254
|
+
authorization: "Bearer must-not-be-forwarded",
|
|
255
|
+
"x-ms-client-principal": encodePrincipal(validPrincipal),
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
const headers = functionsCall(calls).init?.headers as Record<string, string>;
|
|
259
|
+
|
|
260
|
+
expect(headers.Authorization).toBeUndefined();
|
|
261
|
+
expect(code).not.toContain("reqHeaders.get('authorization')");
|
|
262
|
+
expect(decodeForwardedPrincipal(functionsCall(calls))?.userId).toBe("user-123");
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it("defaults /.auth/me to http for local Functions development", async () => {
|
|
266
|
+
const calls = await runGeneratedCall({
|
|
267
|
+
code: generateBFFCallFunctionWithSwaAuth(),
|
|
268
|
+
requestHeaders: { cookie: "session=valid", host: "localhost:3000" },
|
|
269
|
+
mePrincipal: validPrincipal,
|
|
270
|
+
functionsBaseUrl: "http://localhost:7071",
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
expect(calls[0].url).toBe("http://localhost:3000/.auth/me");
|
|
274
|
+
});
|
|
275
|
+
});
|
|
@@ -81,7 +81,7 @@ describe("named authentication routers", () => {
|
|
|
81
81
|
|
|
82
82
|
it("forwards both credential sources and the Functions host key", () => {
|
|
83
83
|
const code = generateBFFCallFunctionWithMultipleAuth();
|
|
84
|
-
expect(code).toContain("fetchHeaders
|
|
84
|
+
expect(code).toContain("fetchHeaders.Authorization");
|
|
85
85
|
expect(code).toContain("fetchHeaders['x-ms-client-principal']");
|
|
86
86
|
expect(code).toContain("'x-functions-key'");
|
|
87
87
|
expect(code).not.toMatch(/console\.log\([^\n]*(authorization|principal|cookie)/i);
|
|
@@ -1439,60 +1439,122 @@ export async function callFunction<TInput = any, TOutput = any>(
|
|
|
1439
1439
|
`;
|
|
1440
1440
|
}
|
|
1441
1441
|
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
let principal: string | null = null;
|
|
1456
|
-
{
|
|
1442
|
+
function generateBFFSwaCredentialForwarding(includeBearer: boolean): string {
|
|
1443
|
+
const bearerForwarding = includeBearer
|
|
1444
|
+
? ` const authorization = reqHeaders.get('authorization');
|
|
1445
|
+
if (authorization?.startsWith('Bearer ')) {
|
|
1446
|
+
fetchHeaders.Authorization = authorization;
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
`
|
|
1450
|
+
: "";
|
|
1451
|
+
|
|
1452
|
+
return `${bearerForwarding} let principal = reqHeaders.get('x-ms-client-principal');
|
|
1453
|
+
|
|
1454
|
+
if (!principal) {
|
|
1457
1455
|
const cookie = reqHeaders.get('cookie');
|
|
1458
|
-
const
|
|
1456
|
+
const forwardedHost = reqHeaders.get('x-forwarded-host');
|
|
1457
|
+
const requestHost = reqHeaders.get('host');
|
|
1458
|
+
const host = (forwardedHost || requestHost)?.split(',')[0].trim();
|
|
1459
|
+
|
|
1459
1460
|
if (cookie && host) {
|
|
1460
|
-
const
|
|
1461
|
+
const forwardedProto = reqHeaders.get('x-forwarded-proto');
|
|
1462
|
+
const proto =
|
|
1463
|
+
forwardedProto?.split(',')[0].trim() ||
|
|
1464
|
+
(isLocalFunctionsUrl(functionsBaseUrl) ? 'http' : 'https');
|
|
1465
|
+
|
|
1461
1466
|
const meResponse = await fetch(\`\${proto}://\${host}/.auth/me\`, {
|
|
1462
1467
|
headers: { cookie },
|
|
1463
1468
|
cache: 'no-store',
|
|
1464
1469
|
});
|
|
1470
|
+
|
|
1465
1471
|
if (meResponse.ok) {
|
|
1466
|
-
const payload = await meResponse.json() as {
|
|
1472
|
+
const payload = (await meResponse.json()) as {
|
|
1473
|
+
clientPrincipal?: unknown;
|
|
1474
|
+
};
|
|
1475
|
+
|
|
1467
1476
|
if (payload.clientPrincipal) {
|
|
1468
|
-
principal = Buffer.from(
|
|
1477
|
+
principal = Buffer.from(
|
|
1478
|
+
JSON.stringify(payload.clientPrincipal),
|
|
1479
|
+
'utf8'
|
|
1480
|
+
).toString('base64');
|
|
1469
1481
|
}
|
|
1470
1482
|
}
|
|
1471
1483
|
}
|
|
1472
1484
|
}
|
|
1485
|
+
|
|
1473
1486
|
if (principal) {
|
|
1474
|
-
const
|
|
1487
|
+
const decodedPrincipal = Buffer.from(principal, 'base64');
|
|
1488
|
+
if (decodedPrincipal.toString('base64') !== principal) {
|
|
1489
|
+
throw new Error('Invalid SWA client principal encoding');
|
|
1490
|
+
}
|
|
1491
|
+
const parsed = JSON.parse(
|
|
1492
|
+
decodedPrincipal.toString('utf8')
|
|
1493
|
+
) as Record<string, unknown>;
|
|
1494
|
+
|
|
1475
1495
|
const normalized = {
|
|
1476
|
-
identityProvider:
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1496
|
+
identityProvider:
|
|
1497
|
+
typeof parsed.identityProvider === 'string'
|
|
1498
|
+
? parsed.identityProvider
|
|
1499
|
+
: '',
|
|
1500
|
+
userId: typeof parsed.userId === 'string' ? parsed.userId : '',
|
|
1501
|
+
userDetails:
|
|
1502
|
+
typeof parsed.userDetails === 'string'
|
|
1503
|
+
? parsed.userDetails
|
|
1504
|
+
: '',
|
|
1505
|
+
userRoles: Array.isArray(parsed.userRoles)
|
|
1506
|
+
? parsed.userRoles.filter(
|
|
1507
|
+
(role: unknown): role is string => typeof role === 'string'
|
|
1508
|
+
)
|
|
1509
|
+
: [],
|
|
1480
1510
|
};
|
|
1481
|
-
|
|
1482
|
-
|
|
1511
|
+
|
|
1512
|
+
if (
|
|
1513
|
+
normalized.identityProvider &&
|
|
1514
|
+
normalized.userId &&
|
|
1515
|
+
normalized.userRoles.includes('authenticated')
|
|
1516
|
+
) {
|
|
1517
|
+
fetchHeaders['x-ms-client-principal'] = Buffer.from(
|
|
1518
|
+
JSON.stringify(normalized),
|
|
1519
|
+
'utf8'
|
|
1520
|
+
).toString('base64');
|
|
1483
1521
|
}
|
|
1484
|
-
}
|
|
1522
|
+
}`;
|
|
1523
|
+
}
|
|
1524
|
+
|
|
1525
|
+
function generateBFFCallFunctionWithSwaCredentials(includeBearer: boolean): string {
|
|
1526
|
+
return generateBFFCallFunctionWithAuth()
|
|
1527
|
+
.replace(
|
|
1528
|
+
` // Authorization ヘッダーの転送(Proxy が cookie → Authorization に変換済み)`,
|
|
1529
|
+
` // Forward only validated credentials from the current request.`
|
|
1530
|
+
)
|
|
1531
|
+
.replace(
|
|
1532
|
+
` const authorization = reqHeaders.get('authorization');
|
|
1533
|
+
if (authorization) {
|
|
1534
|
+
fetchHeaders['Authorization'] = authorization;
|
|
1535
|
+
}`,
|
|
1536
|
+
generateBFFSwaCredentialForwarding(includeBearer)
|
|
1537
|
+
)
|
|
1538
|
+
.replace(
|
|
1539
|
+
` } catch {
|
|
1540
|
+
// headers() が使えないコンテキスト(ISR 等)では無視
|
|
1541
|
+
}`,
|
|
1542
|
+
` } catch (error) {
|
|
1543
|
+
// Do not include credentials or request header values in authentication logs.
|
|
1544
|
+
const errorType = error instanceof Error ? error.name : 'UnknownError';
|
|
1545
|
+
console.error('[BFF] Authentication forwarding failed:', errorType);
|
|
1546
|
+
}`
|
|
1485
1547
|
);
|
|
1486
1548
|
}
|
|
1487
1549
|
|
|
1550
|
+
/** SWA built-in auth variant: forward only a validated SWA client principal. */
|
|
1551
|
+
export function generateBFFCallFunctionWithSwaAuth(): string {
|
|
1552
|
+
return generateBFFCallFunctionWithSwaCredentials(false);
|
|
1553
|
+
}
|
|
1554
|
+
|
|
1488
1555
|
/** Combined transport for named schemes. Functions still performs all verification. */
|
|
1489
1556
|
export function generateBFFCallFunctionWithMultipleAuth(): string {
|
|
1490
|
-
return
|
|
1491
|
-
` // Never forward a browser-supplied principal header. Resolve it from the SWA session endpoint.`,
|
|
1492
|
-
` const authorization = reqHeaders.get('authorization');
|
|
1493
|
-
if (authorization?.startsWith('Bearer ')) fetchHeaders['Authorization'] = authorization;
|
|
1494
|
-
// Never forward a browser-supplied principal header. Resolve it from the SWA session endpoint.`
|
|
1495
|
-
);
|
|
1557
|
+
return generateBFFCallFunctionWithSwaCredentials(true);
|
|
1496
1558
|
}
|
|
1497
1559
|
|
|
1498
1560
|
export function generateSwaAuthHelperTS(): string {
|