swallowkit 1.0.0-beta.45 → 1.0.0-beta.47

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.
Files changed (52) hide show
  1. package/dist/cli/commands/add-auth.d.ts +2 -0
  2. package/dist/cli/commands/add-auth.d.ts.map +1 -1
  3. package/dist/cli/commands/add-auth.js +214 -16
  4. package/dist/cli/commands/add-auth.js.map +1 -1
  5. package/dist/cli/commands/dev.d.ts +4 -0
  6. package/dist/cli/commands/dev.d.ts.map +1 -1
  7. package/dist/cli/commands/dev.js +100 -12
  8. package/dist/cli/commands/dev.js.map +1 -1
  9. package/dist/cli/commands/init.d.ts +2 -0
  10. package/dist/cli/commands/init.d.ts.map +1 -1
  11. package/dist/cli/commands/init.js +74 -30
  12. package/dist/cli/commands/init.js.map +1 -1
  13. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  14. package/dist/cli/commands/scaffold.js +37 -5
  15. package/dist/cli/commands/scaffold.js.map +1 -1
  16. package/dist/cli/index.d.ts.map +1 -1
  17. package/dist/cli/index.js +3 -1
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/core/scaffold/auth-generator.d.ts +20 -2
  20. package/dist/core/scaffold/auth-generator.d.ts.map +1 -1
  21. package/dist/core/scaffold/auth-generator.js +265 -12
  22. package/dist/core/scaffold/auth-generator.js.map +1 -1
  23. package/dist/core/scaffold/connector-functions-generator.d.ts +3 -3
  24. package/dist/core/scaffold/connector-functions-generator.d.ts.map +1 -1
  25. package/dist/core/scaffold/connector-functions-generator.js +19 -19
  26. package/dist/core/scaffold/connector-functions-generator.js.map +1 -1
  27. package/dist/core/scaffold/functions-generator.d.ts +2 -2
  28. package/dist/core/scaffold/functions-generator.d.ts.map +1 -1
  29. package/dist/core/scaffold/functions-generator.js +16 -16
  30. package/dist/core/scaffold/functions-generator.js.map +1 -1
  31. package/dist/core/scaffold/nextjs-generator.d.ts.map +1 -1
  32. package/dist/core/scaffold/nextjs-generator.js +13 -1
  33. package/dist/core/scaffold/nextjs-generator.js.map +1 -1
  34. package/dist/types/index.d.ts +1 -1
  35. package/dist/types/index.d.ts.map +1 -1
  36. package/package.json +1 -1
  37. package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +20 -20
  38. package/src/__tests__/__snapshots__/nextjs-generator.test.ts.snap +13 -1
  39. package/src/__tests__/auth.test.ts +103 -0
  40. package/src/__tests__/dev.test.ts +27 -0
  41. package/src/__tests__/init.test.ts +27 -0
  42. package/src/__tests__/nextjs-generator.test.ts +8 -0
  43. package/src/cli/commands/add-auth.ts +239 -16
  44. package/src/cli/commands/dev.ts +111 -14
  45. package/src/cli/commands/init.ts +76 -30
  46. package/src/cli/commands/scaffold.ts +37 -5
  47. package/src/cli/index.ts +3 -1
  48. package/src/core/scaffold/auth-generator.ts +267 -13
  49. package/src/core/scaffold/connector-functions-generator.ts +22 -19
  50. package/src/core/scaffold/functions-generator.ts +17 -17
  51. package/src/core/scaffold/nextjs-generator.ts +13 -1
  52. package/src/types/index.ts +1 -1
@@ -18,6 +18,23 @@ exports.generateProxy = generateProxy;
18
18
  exports.generateLoginPage = generateLoginPage;
19
19
  exports.generateAuthContext = generateAuthContext;
20
20
  exports.generateBFFCallFunctionWithAuth = generateBFFCallFunctionWithAuth;
21
+ exports.generateBFFCallFunctionWithSwaAuth = generateBFFCallFunctionWithSwaAuth;
22
+ exports.generateSwaAuthHelperTS = generateSwaAuthHelperTS;
23
+ exports.generateExternalTokenAdapter = generateExternalTokenAdapter;
24
+ exports.generateAuthenticatedFetch = generateAuthenticatedFetch;
25
+ exports.generateExternalTokenBFFMeRoute = generateExternalTokenBFFMeRoute;
26
+ exports.generateExternalTokenAuthContext = generateExternalTokenAuthContext;
27
+ exports.generateExternalTokenVerifierTS = generateExternalTokenVerifierTS;
28
+ exports.generateExternalTokenHelperTS = generateExternalTokenHelperTS;
29
+ exports.generateExternalAuthMeTS = generateExternalAuthMeTS;
30
+ exports.generateExternalTokenVerifierCSharp = generateExternalTokenVerifierCSharp;
31
+ exports.generateExternalTokenHelperCSharp = generateExternalTokenHelperCSharp;
32
+ exports.generateExternalAuthMeCSharp = generateExternalAuthMeCSharp;
33
+ exports.generateExternalTokenVerifierPython = generateExternalTokenVerifierPython;
34
+ exports.generateExternalTokenHelperPython = generateExternalTokenHelperPython;
35
+ exports.generateExternalAuthMePython = generateExternalAuthMePython;
36
+ exports.generateSwaAuthHelperPython = generateSwaAuthHelperPython;
37
+ exports.generateSwaAuthHelperCSharp = generateSwaAuthHelperCSharp;
21
38
  exports.generateAuthImportTS = generateAuthImportTS;
22
39
  exports.generateAuthGuardTS = generateAuthGuardTS;
23
40
  exports.generateAuthGuardCSharp = generateAuthGuardCSharp;
@@ -113,7 +130,7 @@ ${getConnection}
113
130
  app.http('auth-login', {
114
131
  methods: ['POST'],
115
132
  route: 'auth/login',
116
- authLevel: 'anonymous',
133
+ authLevel: 'function',
117
134
  handler: async (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> => {
118
135
  try {
119
136
  const body = LoginRequest.parse(await request.json());
@@ -171,7 +188,7 @@ app.http('auth-login', {
171
188
  app.http('auth-me', {
172
189
  methods: ['GET'],
173
190
  route: 'auth/me',
174
- authLevel: 'anonymous',
191
+ authLevel: 'function',
175
192
  handler: async (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> => {
176
193
  try {
177
194
  const user = requireAuth(request);
@@ -189,7 +206,7 @@ app.http('auth-me', {
189
206
  app.http('auth-logout', {
190
207
  methods: ['POST'],
191
208
  route: 'auth/logout',
192
- authLevel: 'anonymous',
209
+ authLevel: 'function',
193
210
  handler: async (request: HttpRequest): Promise<HttpResponseInit> => {
194
211
  return { status: 200, jsonBody: { message: 'Logged out' } };
195
212
  },
@@ -304,7 +321,7 @@ namespace Functions.Auth
304
321
  {
305
322
  [Function("auth-login")]
306
323
  public async Task<HttpResponseData> Login(
307
- [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "auth/login")] HttpRequestData request)
324
+ [HttpTrigger(AuthorizationLevel.Function, "post", Route = "auth/login")] HttpRequestData request)
308
325
  {
309
326
  var body = await JsonSerializer.DeserializeAsync<LoginRequest>(request.Body);
310
327
  if (body == null || string.IsNullOrEmpty(body.LoginId) || string.IsNullOrEmpty(body.Password))
@@ -363,7 +380,7 @@ namespace Functions.Auth
363
380
 
364
381
  [Function("auth-me")]
365
382
  public async Task<HttpResponseData> Me(
366
- [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "auth/me")] HttpRequestData request)
383
+ [HttpTrigger(AuthorizationLevel.Function, "get", Route = "auth/me")] HttpRequestData request)
367
384
  {
368
385
  var (principal, errorResponse) = await JwtHelper.Authorize(request);
369
386
  if (errorResponse != null) return errorResponse;
@@ -382,7 +399,7 @@ namespace Functions.Auth
382
399
 
383
400
  [Function("auth-logout")]
384
401
  public async Task<HttpResponseData> Logout(
385
- [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "auth/logout")] HttpRequestData request)
402
+ [HttpTrigger(AuthorizationLevel.Function, "post", Route = "auth/logout")] HttpRequestData request)
386
403
  {
387
404
  var response = request.CreateResponse(System.Net.HttpStatusCode.OK);
388
405
  await response.WriteAsJsonAsync(new { message = "Logged out" });
@@ -561,7 +578,7 @@ auth_bp = func.Blueprint()
561
578
  ${getConnection}
562
579
 
563
580
 
564
- @auth_bp.route(route="auth/login", methods=["POST"], auth_level=func.AuthLevel.ANONYMOUS)
581
+ @auth_bp.route(route="auth/login", methods=["POST"], auth_level=func.AuthLevel.FUNCTION)
565
582
  def auth_login(req: func.HttpRequest) -> func.HttpResponse:
566
583
  try:
567
584
  body = req.get_json()
@@ -633,7 +650,7 @@ def auth_login(req: func.HttpRequest) -> func.HttpResponse:
633
650
  )
634
651
 
635
652
 
636
- @auth_bp.route(route="auth/me", methods=["GET"], auth_level=func.AuthLevel.ANONYMOUS)
653
+ @auth_bp.route(route="auth/me", methods=["GET"], auth_level=func.AuthLevel.FUNCTION)
637
654
  def auth_me(req: func.HttpRequest) -> func.HttpResponse:
638
655
  from auth.jwt_helper import require_auth, handle_auth_error
639
656
 
@@ -652,7 +669,7 @@ def auth_me(req: func.HttpRequest) -> func.HttpResponse:
652
669
  )
653
670
 
654
671
 
655
- @auth_bp.route(route="auth/logout", methods=["POST"], auth_level=func.AuthLevel.ANONYMOUS)
672
+ @auth_bp.route(route="auth/logout", methods=["POST"], auth_level=func.AuthLevel.FUNCTION)
656
673
  def auth_logout(req: func.HttpRequest) -> func.HttpResponse:
657
674
  return func.HttpResponse(
658
675
  json.dumps({"message": "Logged out"}),
@@ -1089,6 +1106,17 @@ function getFunctionsBaseUrl(): string {
1089
1106
  return process.env.BACKEND_FUNCTIONS_BASE_URL || process.env.FUNCTIONS_BASE_URL || 'http://localhost:7071';
1090
1107
  }
1091
1108
 
1109
+ function isLocalFunctionsUrl(url: string): boolean {
1110
+ return url.startsWith('http://localhost:') || url.startsWith('http://127.0.0.1:');
1111
+ }
1112
+
1113
+ function getFunctionsKeyHeaders(functionsBaseUrl: string): Record<string, string> {
1114
+ const key = process.env.BACKEND_FUNCTIONS_KEY;
1115
+ if (key) return { 'x-functions-key': key };
1116
+ if (isLocalFunctionsUrl(functionsBaseUrl)) return {};
1117
+ throw new Error('BACKEND_FUNCTIONS_KEY is required for non-local Functions calls');
1118
+ }
1119
+
1092
1120
  interface CallFunctionConfig<TInput = any, TOutput = any> {
1093
1121
  /** HTTP メソッド */
1094
1122
  method: 'GET' | 'POST' | 'PUT' | 'DELETE';
@@ -1127,11 +1155,13 @@ export async function callFunction<TInput = any, TOutput = any>(
1127
1155
  // Azure Functions を呼び出し
1128
1156
  const functionsBaseUrl = getFunctionsBaseUrl();
1129
1157
  const url = functionsBaseUrl + path;
1158
+ const keyHeaders = getFunctionsKeyHeaders(functionsBaseUrl);
1130
1159
  console.log(\`[BFF] \${method} \${url}\`);
1131
1160
 
1132
1161
  // Authorization ヘッダーの転送(Proxy が cookie → Authorization に変換済み)
1133
1162
  const fetchHeaders: Record<string, string> = {
1134
1163
  'Content-Type': 'application/json',
1164
+ ...keyHeaders,
1135
1165
  };
1136
1166
  try {
1137
1167
  const reqHeaders = await headers();
@@ -1190,6 +1220,229 @@ export async function callFunction<TInput = any, TOutput = any>(
1190
1220
  }
1191
1221
  `;
1192
1222
  }
1223
+ /** SWA built-in auth variant: forward only a platform-derived client principal. */
1224
+ function generateBFFCallFunctionWithSwaAuth() {
1225
+ return generateBFFCallFunctionWithAuth()
1226
+ .replace(` // Authorization ヘッダーの転送(Proxy が cookie → Authorization に変換済み)`, ` // SWA client principal is accepted only from the platform request context.`)
1227
+ .replace(` const authorization = reqHeaders.get('authorization');
1228
+ if (authorization) {
1229
+ fetchHeaders['Authorization'] = authorization;
1230
+ }`, ` let principal = reqHeaders.get('x-ms-client-principal');
1231
+ if (!principal) {
1232
+ const cookie = reqHeaders.get('cookie');
1233
+ const host = reqHeaders.get('host');
1234
+ if (cookie && host) {
1235
+ const proto = reqHeaders.get('x-forwarded-proto') || 'https';
1236
+ const meResponse = await fetch(\`\${proto}://\${host}/.auth/me\`, {
1237
+ headers: { cookie },
1238
+ cache: 'no-store',
1239
+ });
1240
+ if (meResponse.ok) {
1241
+ const payload = await meResponse.json() as { clientPrincipal?: unknown };
1242
+ if (payload.clientPrincipal) {
1243
+ principal = Buffer.from(JSON.stringify(payload.clientPrincipal), 'utf8').toString('base64');
1244
+ }
1245
+ }
1246
+ }
1247
+ }
1248
+ if (principal) {
1249
+ const parsed = JSON.parse(Buffer.from(principal, 'base64').toString('utf8'));
1250
+ const normalized = {
1251
+ identityProvider: String(parsed.identityProvider || ''),
1252
+ userId: String(parsed.userId || ''),
1253
+ userDetails: String(parsed.userDetails || ''),
1254
+ userRoles: Array.isArray(parsed.userRoles) ? parsed.userRoles.filter((role: unknown) => typeof role === 'string') : [],
1255
+ };
1256
+ if (normalized.userId && normalized.userRoles.includes('authenticated')) {
1257
+ fetchHeaders['x-ms-client-principal'] = Buffer.from(JSON.stringify(normalized), 'utf8').toString('base64');
1258
+ }
1259
+ }`);
1260
+ }
1261
+ function generateSwaAuthHelperTS() {
1262
+ return `import { HttpRequest, HttpResponseInit } from '@azure/functions';
1263
+
1264
+ export interface AuthUser { id: string; loginId: string; roles: string[]; }
1265
+ export class AuthError extends Error { constructor(public status: number, message: string) { super(message); } }
1266
+
1267
+ export function requireAuth(request: HttpRequest): AuthUser {
1268
+ const encoded = request.headers.get('x-ms-client-principal');
1269
+ if (!encoded) throw new AuthError(401, 'Authentication required');
1270
+ try {
1271
+ const value = JSON.parse(Buffer.from(encoded, 'base64').toString('utf8'));
1272
+ const roles = Array.isArray(value.userRoles) ? value.userRoles.filter((r: unknown) => typeof r === 'string') : [];
1273
+ if (typeof value.userId !== 'string' || !value.userId || !roles.includes('authenticated')) throw new Error();
1274
+ return { id: value.userId, loginId: typeof value.userDetails === 'string' ? value.userDetails : '', roles };
1275
+ } catch { throw new AuthError(401, 'Invalid client principal'); }
1276
+ }
1277
+ export function requireRoles(user: AuthUser, roles: string[]): void {
1278
+ if (roles.length && !roles.some(role => user.roles.includes(role))) throw new AuthError(403, 'Insufficient permissions');
1279
+ }
1280
+ export function handleAuthError(error: unknown): HttpResponseInit | null {
1281
+ return error instanceof AuthError ? { status: error.status, jsonBody: { error: error.message } } : null;
1282
+ }
1283
+ `;
1284
+ }
1285
+ // ============================================================
1286
+ // External token authentication
1287
+ // ============================================================
1288
+ function generateExternalTokenAdapter() {
1289
+ return `/** Replace these functions with your external IdP SDK integration. */
1290
+ export async function getToken(): Promise<string | null> { return null; }
1291
+ export async function login(): Promise<void> { throw new Error('External token login adapter is not configured'); }
1292
+ export async function logout(): Promise<void> { throw new Error('External token logout adapter is not configured'); }
1293
+ `;
1294
+ }
1295
+ function generateAuthenticatedFetch() {
1296
+ return `import { getToken } from './external-token-adapter';
1297
+
1298
+ export async function authenticatedFetch(input: RequestInfo | URL, init: RequestInit = {}): Promise<Response> {
1299
+ const token = await getToken();
1300
+ if (!token) return new Response(JSON.stringify({ error: 'Authentication required' }), { status: 401, headers: { 'content-type': 'application/json' } });
1301
+ const headers = new Headers(init.headers);
1302
+ headers.set('Authorization', \`Bearer \${token}\`);
1303
+ return fetch(input, { ...init, headers });
1304
+ }
1305
+ `;
1306
+ }
1307
+ function generateExternalTokenBFFMeRoute() {
1308
+ return `import { callFunction } from '@/lib/api/call-function';
1309
+ export async function GET() { return callFunction({ method: 'GET', path: '/api/auth/me' }); }
1310
+ `;
1311
+ }
1312
+ function generateExternalTokenAuthContext() {
1313
+ return `'use client';
1314
+ import { createContext, useContext, useEffect, useState, type ReactNode } from 'react';
1315
+ import { authenticatedFetch } from './authenticated-fetch';
1316
+ import * as adapter from './external-token-adapter';
1317
+ export interface AuthUser { id: string; loginId: string; name: string; email: string; roles: string[]; }
1318
+ interface Value { user: AuthUser | null; loading: boolean; login: () => Promise<void>; logout: () => Promise<void>; hasRole: (role: string) => boolean; hasAnyRole: (roles: string[]) => boolean; }
1319
+ const Context = createContext<Value | null>(null);
1320
+ export function AuthProvider({ children }: { children: ReactNode }) {
1321
+ const [user, setUser] = useState<AuthUser | null>(null); const [loading, setLoading] = useState(true);
1322
+ useEffect(() => { authenticatedFetch('/api/auth/me').then(async r => {
1323
+ if (!r.ok || !(r.headers.get('content-type') || '').includes('application/json')) return null;
1324
+ return r.json() as Promise<AuthUser>;
1325
+ }).then(setUser).catch(() => setUser(null)).finally(() => setLoading(false)); }, []);
1326
+ const hasRole = (role: string) => user?.roles.includes(role) ?? false;
1327
+ const logout = async () => { await adapter.logout(); setUser(null); };
1328
+ return <Context.Provider value={{ user, loading, login: adapter.login, logout, hasRole, hasAnyRole: roles => roles.some(hasRole) }}>{children}</Context.Provider>;
1329
+ }
1330
+ export function useAuth() { const value = useContext(Context); if (!value) throw new Error('useAuth must be used within an AuthProvider'); return value; }
1331
+ `;
1332
+ }
1333
+ function generateExternalTokenVerifierTS() {
1334
+ return `export interface ExternalAuthPrincipal { userId: string; userDetails: string; roles: string[]; }
1335
+ export class ExternalTokenVerificationError extends Error { constructor(public status: 401 | 503, message: string) { super(message); } }
1336
+ /** Implement IdP verification here. Never decode and trust a token without verification. */
1337
+ export async function verifyExternalToken(_token: string): Promise<ExternalAuthPrincipal> {
1338
+ throw new Error('External token verifier is not configured');
1339
+ }
1340
+ `;
1341
+ }
1342
+ function generateExternalTokenHelperTS() {
1343
+ return `import { HttpRequest, HttpResponseInit } from '@azure/functions';
1344
+ import { verifyExternalToken, ExternalTokenVerificationError, type ExternalAuthPrincipal } from './external-token-verifier';
1345
+ export class AuthError extends Error { constructor(public status: number, message: string) { super(message); } }
1346
+ export async function requireAuth(request: HttpRequest): Promise<ExternalAuthPrincipal> {
1347
+ const header = request.headers.get('authorization') || '';
1348
+ if (!header.startsWith('Bearer ') || !header.slice(7)) throw new AuthError(401, 'Missing or invalid Authorization header');
1349
+ try { const principal = await verifyExternalToken(header.slice(7));
1350
+ if (!principal?.userId || !Array.isArray(principal.roles)) throw new AuthError(401, 'Invalid external principal');
1351
+ return principal;
1352
+ } catch (error) { if (error instanceof AuthError) throw error; if (error instanceof ExternalTokenVerificationError) throw new AuthError(error.status, error.message); throw new AuthError(500, 'External token verifier is not configured'); }
1353
+ }
1354
+ export function requireRoles(user: ExternalAuthPrincipal, roles: string[]) { if (!roles.some(role => user.roles.includes(role))) throw new AuthError(403, 'Insufficient permissions'); }
1355
+ export function handleAuthError(error: unknown): HttpResponseInit | null { return error instanceof AuthError ? { status: error.status, jsonBody: { error: error.message } } : null; }
1356
+ `;
1357
+ }
1358
+ function generateExternalAuthMeTS() {
1359
+ return `import { app, HttpRequest, HttpResponseInit } from '@azure/functions';
1360
+ import { requireAuth, handleAuthError } from './auth/jwt-helper';
1361
+ app.http('external-auth-me', { methods: ['GET'], route: 'auth/me', authLevel: 'function', handler: async (request: HttpRequest): Promise<HttpResponseInit> => {
1362
+ try { const p = await requireAuth(request); return { status: 200, jsonBody: { id: p.userId, loginId: p.userDetails, name: p.userDetails, email: '', roles: p.roles } }; }
1363
+ catch (error) { return handleAuthError(error) || { status: 500, jsonBody: { error: 'Authentication failed' } }; }
1364
+ } });
1365
+ `;
1366
+ }
1367
+ function generateExternalTokenVerifierCSharp() { return `namespace Functions.Auth;\npublic record ExternalAuthPrincipal(string UserId, string UserDetails, string[] Roles);\npublic static class ExternalTokenVerifier { public static Task<ExternalAuthPrincipal> VerifyExternalToken(string token) => throw new InvalidOperationException("External token verifier is not configured"); }\n`; }
1368
+ function generateExternalTokenHelperCSharp() { return `using Microsoft.Azure.Functions.Worker.Http;\nnamespace Functions.Auth;\npublic static class JwtHelper { public static async Task<(ExternalAuthPrincipal? Principal, HttpResponseData? ErrorResponse)> Authorize(HttpRequestData request, params string[] roles) { if (!request.Headers.TryGetValues("Authorization", out var values) || !values.FirstOrDefault()!.StartsWith("Bearer ")) { var r=request.CreateResponse(System.Net.HttpStatusCode.Unauthorized); await r.WriteAsJsonAsync(new { error="Authentication required" }); return (null,r); } try { var p=await ExternalTokenVerifier.VerifyExternalToken(values.First()[7..]); if (roles.Length>0 && !roles.Any(p.Roles.Contains)) { var r=request.CreateResponse(System.Net.HttpStatusCode.Forbidden); await r.WriteAsJsonAsync(new { error="Insufficient permissions" }); return (null,r); } return (p,null); } catch (HttpRequestException) { var r=request.CreateResponse(System.Net.HttpStatusCode.ServiceUnavailable); await r.WriteAsJsonAsync(new { error="Identity provider unavailable" }); return (null,r); } catch { var r=request.CreateResponse(System.Net.HttpStatusCode.Unauthorized); await r.WriteAsJsonAsync(new { error="Authentication failed" }); return (null,r); } } }\n`; }
1369
+ function generateExternalAuthMeCSharp() { return `using Microsoft.Azure.Functions.Worker;\nusing Microsoft.Azure.Functions.Worker.Http;\nnamespace Functions.Auth;\npublic class ExternalAuthMe { [Function("external-auth-me")] public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Function,"get",Route="auth/me")] HttpRequestData req) { var (p,e)=await JwtHelper.Authorize(req); if(e!=null)return e; var r=req.CreateResponse(System.Net.HttpStatusCode.OK); await r.WriteAsJsonAsync(new { id=p!.UserId, loginId=p.UserDetails, name=p.UserDetails, email="", roles=p.Roles }); return r; } }\n`; }
1370
+ function generateExternalTokenVerifierPython() { return `class ExternalTokenVerificationError(Exception):\n def __init__(self, status: int, message: str): self.status, self.message = status, message\n\ndef verify_external_token(token: str) -> dict:\n raise RuntimeError("External token verifier is not configured")\n`; }
1371
+ function generateExternalTokenHelperPython() { return `import azure.functions as func\nfrom .external_token_verifier import verify_external_token, ExternalTokenVerificationError\nclass AuthError(Exception):\n def __init__(self,status,message): self.status,self.message=status,message\ndef require_auth(req: func.HttpRequest):\n header=req.headers.get("authorization","")\n if not header.startswith("Bearer "): raise AuthError(401,"Authentication required")\n try:\n p=verify_external_token(header[7:])\n if not p.get("userId") or not isinstance(p.get("roles"),list): raise AuthError(401,"Invalid external principal")\n return p\n except ExternalTokenVerificationError as e: raise AuthError(e.status,e.message)\n except AuthError: raise\n except RuntimeError: raise AuthError(500,"External token verifier is not configured")\ndef require_roles(user,roles):\n if not any(r in user.get("roles",[]) for r in roles): raise AuthError(403,"Insufficient permissions")\ndef handle_auth_error(error):\n return func.HttpResponse('{"error":"%s"}' % error.message,status_code=error.status,mimetype="application/json") if isinstance(error,AuthError) else None\n`; }
1372
+ function generateExternalAuthMePython() { return `import json\nimport azure.functions as func\nfrom auth.jwt_helper import require_auth, handle_auth_error\nbp=func.Blueprint()\n@bp.route(route="auth/me",methods=["GET"],auth_level=func.AuthLevel.FUNCTION)\ndef auth_me(req: func.HttpRequest):\n try:\n p=require_auth(req); return func.HttpResponse(json.dumps({"id":p["userId"],"loginId":p.get("userDetails",""),"name":p.get("userDetails",""),"email":"","roles":p["roles"]}),mimetype="application/json")\n except Exception as e:\n return handle_auth_error(e) or func.HttpResponse('{"error":"Authentication failed"}',status_code=500,mimetype="application/json")\n`; }
1373
+ function generateSwaAuthHelperPython() {
1374
+ return `import base64
1375
+ import json
1376
+ import azure.functions as func
1377
+
1378
+ class AuthError(Exception):
1379
+ def __init__(self, status, message): self.status, self.message = status, message
1380
+
1381
+ def require_auth(req):
1382
+ encoded = req.headers.get("x-ms-client-principal")
1383
+ if not encoded: raise AuthError(401, "Authentication required")
1384
+ try:
1385
+ value = json.loads(base64.b64decode(encoded).decode("utf-8"))
1386
+ roles = [r for r in value.get("userRoles", []) if isinstance(r, str)]
1387
+ if not value.get("userId") or "authenticated" not in roles: raise ValueError()
1388
+ return {"id": value["userId"], "loginId": value.get("userDetails", ""), "roles": roles}
1389
+ except Exception: raise AuthError(401, "Invalid client principal")
1390
+
1391
+ def require_roles(user, roles):
1392
+ if roles and not any(role in user["roles"] for role in roles): raise AuthError(403, "Insufficient permissions")
1393
+
1394
+ def handle_auth_error(error):
1395
+ return func.HttpResponse(json.dumps({"error": error.message}), status_code=error.status, mimetype="application/json") if isinstance(error, AuthError) else None
1396
+ `;
1397
+ }
1398
+ function generateSwaAuthHelperCSharp() {
1399
+ return `using System.Text;
1400
+ using System.Text.Json;
1401
+ using Microsoft.Azure.Functions.Worker.Http;
1402
+
1403
+ namespace Functions.Auth;
1404
+
1405
+ public class JwtPayload
1406
+ {
1407
+ public string Sub { get; set; } = "";
1408
+ public string LoginId { get; set; } = "";
1409
+ public string[] Roles { get; set; } = Array.Empty<string>();
1410
+ }
1411
+
1412
+ public static class JwtHelper
1413
+ {
1414
+ public static async Task<(JwtPayload?, HttpResponseData?)> Authorize(HttpRequestData request, params string[] requiredRoles)
1415
+ {
1416
+ try
1417
+ {
1418
+ var encoded = request.Headers.TryGetValues("x-ms-client-principal", out var values) ? values.FirstOrDefault() : null;
1419
+ if (string.IsNullOrWhiteSpace(encoded)) throw new InvalidOperationException();
1420
+ using var document = JsonDocument.Parse(Encoding.UTF8.GetString(Convert.FromBase64String(encoded)));
1421
+ var root = document.RootElement;
1422
+ var userId = root.GetProperty("userId").GetString() ?? "";
1423
+ var details = root.TryGetProperty("userDetails", out var detailValue) ? detailValue.GetString() ?? "" : "";
1424
+ var roles = root.TryGetProperty("userRoles", out var roleValue) && roleValue.ValueKind == JsonValueKind.Array
1425
+ ? roleValue.EnumerateArray().Where(v => v.ValueKind == JsonValueKind.String).Select(v => v.GetString()!).ToArray()
1426
+ : Array.Empty<string>();
1427
+ if (string.IsNullOrEmpty(userId) || !roles.Contains("authenticated")) throw new InvalidOperationException();
1428
+ if (requiredRoles.Length > 0 && !requiredRoles.Any(roles.Contains))
1429
+ {
1430
+ var forbidden = request.CreateResponse(System.Net.HttpStatusCode.Forbidden);
1431
+ await forbidden.WriteAsJsonAsync(new { error = "Forbidden" });
1432
+ return (null, forbidden);
1433
+ }
1434
+ return (new JwtPayload { Sub = userId, LoginId = details, Roles = roles }, null);
1435
+ }
1436
+ catch
1437
+ {
1438
+ var unauthorized = request.CreateResponse(System.Net.HttpStatusCode.Unauthorized);
1439
+ await unauthorized.WriteAsJsonAsync(new { error = "Unauthorized" });
1440
+ return (null, unauthorized);
1441
+ }
1442
+ }
1443
+ }
1444
+ `;
1445
+ }
1193
1446
  // ============================================================
1194
1447
  // 13. scaffold 用ロールガード挿入ヘルパー
1195
1448
  // ============================================================
@@ -1202,15 +1455,15 @@ function generateAuthImportTS() {
1202
1455
  /**
1203
1456
  * TypeScript Functions のハンドラー先頭に挿入する認証チェックコードを生成
1204
1457
  */
1205
- function generateAuthGuardTS(policy, operation) {
1458
+ function generateAuthGuardTS(policy, operation, provider) {
1206
1459
  const roles = operation === 'read'
1207
1460
  ? (policy.read || policy.roles || [])
1208
1461
  : (policy.write || policy.roles || []);
1209
1462
  if (roles.length > 0) {
1210
- return ` const authUser = requireAuth(request);
1463
+ return ` const authUser = ${provider === 'external-token' ? 'await ' : ''}requireAuth(request);
1211
1464
  requireRoles(authUser, ${JSON.stringify(roles)});`;
1212
1465
  }
1213
- return ` const authUser = requireAuth(request);`;
1466
+ return ` const authUser = ${provider === 'external-token' ? 'await ' : ''}requireAuth(request);`;
1214
1467
  }
1215
1468
  /**
1216
1469
  * C# Functions のハンドラーに挿入するロールガードコードを生成
@@ -1 +1 @@
1
- {"version":3,"file":"auth-generator.js","sourceRoot":"","sources":["../../../src/core/scaffold/auth-generator.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAUH,gDA8BC;AAMD,0DAkJC;AAMD,kDAwEC;AAMD,kEAkIC;AAMD,0DA+GC;AAMD,kEAoJC;AAMD,0DAyEC;AAMD,8DAuCC;AAED,gEAUC;AAED,wDA+BC;AAMD,sCAoDC;AAMD,8CA0FC;AAMD,kDA+FC;AAMD,0EAkHC;AASD,oDAEC;AAKD,kDAUC;AAKD,0DAYC;AAKD,0DAWC;AA1vCD,+DAA+D;AAC/D,qCAAqC;AACrC,+DAA+D;AAE/D,SAAgB,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BR,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,iCAAiC;AACjC,+DAA+D;AAE/D,SAAgB,uBAAuB,CACrC,iBAAyB,EACzB,MAAuB,EACvB,QAAqB;IAErB,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAEzE,MAAM,YAAY,GAAG,QAAQ,KAAK,OAAO;QACvC,CAAC,CAAC,qCAAqC;QACvC,CAAC,CAAC,QAAQ,KAAK,UAAU;YACzB,CAAC,CAAC,sBAAsB;YACxB,CAAC,CAAC,0BAA0B,CAAC;IAE/B,MAAM,aAAa,GAAG,QAAQ,KAAK,OAAO;QACxC,CAAC,CAAC;8CACwC,MAAM;EAClD;QACE,CAAC,CAAC,QAAQ,KAAK,UAAU;YACzB,CAAC,CAAC;6CACuC,MAAM;;;EAGjD;YACE,CAAC,CAAC;mCAC6B,MAAM;EACvC,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAE5F,MAAM,SAAS,GAAG,QAAQ,KAAK,OAAO;QACpC,CAAC,CAAC,wBAAwB,OAAO;2BACV,MAAM,CAAC,SAAS,UAAU,MAAM,CAAC,aAAa;;;qCAGpC;QACjC,CAAC,CAAC,QAAQ,KAAK,UAAU;YACzB,CAAC,CAAC,wBAAwB,OAAO;2BACV,MAAM,CAAC,SAAS,UAAU,MAAM,CAAC,aAAa;;;mCAGtC;YAC/B,CAAC,CAAC,wBAAwB,OAAO;;kCAEH,MAAM,CAAC,SAAS,UAAU,MAAM,CAAC,aAAa;wCACxC,CAAC;IAEvC,MAAM,OAAO,GAAG,QAAQ,KAAK,OAAO;QAClC,CAAC,CAAC,SAAS,OAAO,SAAS;QAC3B,CAAC,CAAC,QAAQ,KAAK,UAAU;YACzB,CAAC,CAAC,SAAS,OAAO,SAAS;YAC3B,CAAC,CAAC,SAAS,OAAO,WAAW,CAAC;IAEhC,OAAO;yDACgD,iBAAiB;;;EAGxE,YAAY;;EAEZ,aAAa;;;;;;;;;;;cAWD,OAAO;;UAEX,SAAS;;;;;;;iEAO8C,MAAM,CAAC,kBAAkB;;;;;;;0BAOhE,MAAM,CAAC,WAAW;;sCAEN,MAAM,CAAC,WAAW;;2BAE7B,MAAM,CAAC,WAAW;;wCAEL,MAAM,CAAC,WAAW;yBACjC,MAAM,CAAC,WAAW;;;;;0BAKjB,MAAM,CAAC,aAAa;oCACV,MAAM,CAAC,aAAa;;;;;;;;;;;UAW9C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoChB,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,2BAA2B;AAC3B,+DAA+D;AAE/D,SAAgB,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsER,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,8BAA8B;AAC9B,+DAA+D;AAE/D,SAAgB,2BAA2B,CACzC,MAAuB,EACvB,QAAqB;IAErB,MAAM,cAAc,GAAG,QAAQ,KAAK,OAAO;QACzC,CAAC,CAAC,uBAAuB;QACzB,CAAC,CAAC,QAAQ,KAAK,UAAU;YACzB,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,iCAAiC,CAAC;IAEtC,MAAM,QAAQ,GAAG,QAAQ,KAAK,OAAO;QACnC,CAAC,CAAC,iBAAiB;QACnB,CAAC,CAAC,QAAQ,KAAK,UAAU;YACzB,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,eAAe,CAAC;IAEpB,MAAM,OAAO,GAAG,QAAQ,KAAK,OAAO;QAClC,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,QAAQ,KAAK,UAAU;YACzB,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,YAAY,CAAC;IAEjB,OAAO;;;;EAIP,cAAc;;;;;;;;;;;;;;;;;;;yCAmByB,QAAQ;sDACK,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE;;;wCAGhD,OAAO;iCACd,MAAM,CAAC,SAAS,UAAU,MAAM,CAAC,aAAa;;;;;;;;;;;yCAWtC,MAAM,CAAC,kBAAkB;;;;;;;;qCAQ7B,MAAM,CAAC,WAAW;;;;;;oCAMnB,MAAM,CAAC,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDvD,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,mBAAmB;AACnB,+DAA+D;AAE/D,SAAgB,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6GR,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,kCAAkC;AAClC,+DAA+D;AAE/D,SAAgB,2BAA2B,CACzC,MAAuB,EACvB,QAAqB;IAErB,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;IAErD,MAAM,YAAY,GAAG,QAAQ,KAAK,OAAO;QACvC,CAAC,CAAC,wBAAwB;QAC1B,CAAC,CAAC,QAAQ,KAAK,UAAU;YACzB,CAAC,CAAC,yCAAyC;YAC3C,CAAC,CAAC,gBAAgB,CAAC;IAErB,MAAM,aAAa,GAAG,QAAQ,KAAK,OAAO;QACxC,CAAC,CAAC;;+BAEyB,SAAS;+BACT,SAAS;mCACL,SAAS;mCACT,SAAS;MACtC;QACF,CAAC,CAAC,QAAQ,KAAK,UAAU;YACzB,CAAC,CAAC;8CACwC,SAAS,2BAA2B;YAC9E,CAAC,CAAC;;iCAE2B,SAAS;+BACX,SAAS;mCACL,SAAS;mCACT,SAAS;MACtC,CAAC;IAEL,MAAM,YAAY,GAAG,QAAQ,KAAK,OAAO;QACvC,CAAC,CAAC,uCAAuC;QACzC,CAAC,CAAC,QAAQ,KAAK,UAAU;YACzB,CAAC,CAAC,qEAAqE;YACvE,CAAC,CAAC,oCAAoC,CAAC;IAEzC,OAAO;;;;;;EAMP,YAAY;;;;EAIZ,aAAa;;;;;;;;;;;;;;;;;UAiBL,YAAY;;6BAEO,MAAM,CAAC,SAAS,UAAU,MAAM,CAAC,aAAa;;;;;;;;;;;;;;;oBAevD,MAAM,CAAC,kBAAkB;;;;;;;gCAOb,MAAM,CAAC,WAAW;;;;;;;;;;;+BAWnB,MAAM,CAAC,aAAa;6CACN,MAAM,CAAC,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+ChE,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,uBAAuB;AACvB,+DAA+D;AAE/D,SAAgB,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuER,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,yCAAyC;AACzC,+DAA+D;AAE/D,SAAgB,yBAAyB,CAAC,WAAmB,EAAE,iBAAyB;IACtF,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,aAAa,CAAC;IACpG,OAAO;+CACsC,iBAAiB;;;;;;;;;;;;;;;;;;;;;;4BAsBpC,UAAU;;;;;;;;;;;;;CAarC,CAAC;AACF,CAAC;AAED,SAAgB,0BAA0B,CAAC,WAAmB;IAC5D,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,aAAa,CAAC;IACpG,OAAO;;;;6BAIoB,UAAU;;;CAGtC,CAAC;AACF,CAAC;AAED,SAAgB,sBAAsB,CAAC,kBAA2B;IAChE,KAAK,kBAAkB,CAAC;IACxB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BR,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,yCAAyC;AACzC,+DAA+D;AAE/D,SAAgB,aAAa,CAAC,WAAmB;IAC/C,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,aAAa,CAAC;IACpG,OAAO;;;4BAGmB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CrC,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,cAAc;AACd,+DAA+D;AAE/D,SAAgB,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwFR,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAE/D,SAAgB,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6FR,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAE/D,SAAgB,+BAA+B;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgHR,CAAC;AACF,CAAC;AAED,+DAA+D;AAC/D,6BAA6B;AAC7B,+DAA+D;AAE/D;;GAEG;AACH,SAAgB,oBAAoB;IAClC,OAAO,iFAAiF,CAAC;AAC3F,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,MAAuB,EAAE,SAA2B;IACtF,MAAM,KAAK,GAAG,SAAS,KAAK,MAAM;QAChC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO;+BACoB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IACvD,CAAC;IACD,OAAO,8CAA8C,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,MAAuB,EAAE,SAA2B;IAC1F,MAAM,KAAK,GAAG,SAAS,KAAK,MAAM;QAChC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO,mFAAmF,QAAQ;6DACzC,CAAC;IAC5D,CAAC;IACD,OAAO;6DACoD,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,MAAuB,EAAE,SAA2B;IAC1F,MAAM,KAAK,GAAG,SAAS,KAAK,MAAM;QAChC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO;2BACgB,QAAQ,IAAI,CAAC;IACtC,CAAC;IACD,OAAO,8BAA8B,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"auth-generator.js","sourceRoot":"","sources":["../../../src/core/scaffold/auth-generator.ts"],"names":[],"mappings":"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"}
@@ -3,15 +3,15 @@
3
3
  * RDB(MySQL/PostgreSQL/SQL Server)および 外部 REST API コネクタ向けのハンドラーを生成
4
4
  */
5
5
  import { ModelInfo } from "./model-parser";
6
- import { RdbConnectorConfig, ApiConnectorConfig, RdbModelConnectorConfig, ApiModelConnectorConfig, ConnectorOperation, ModelAuthPolicy } from "../../types";
6
+ import { RdbConnectorConfig, ApiConnectorConfig, RdbModelConnectorConfig, ApiModelConnectorConfig, ConnectorOperation, ModelAuthPolicy, AuthProvider } from "../../types";
7
7
  /**
8
8
  * RDB コネクタ用 TypeScript Azure Functions を生成
9
9
  */
10
- export declare function generateRdbConnectorFunctionTS(model: ModelInfo, sharedPackageName: string, connectorDef: RdbConnectorConfig, modelConnector: RdbModelConnectorConfig, authPolicy?: ModelAuthPolicy): string;
10
+ export declare function generateRdbConnectorFunctionTS(model: ModelInfo, sharedPackageName: string, connectorDef: RdbConnectorConfig, modelConnector: RdbModelConnectorConfig, authPolicy?: ModelAuthPolicy, authProvider?: AuthProvider): string;
11
11
  /**
12
12
  * API コネクタ用 TypeScript Azure Functions を生成
13
13
  */
14
- export declare function generateApiConnectorFunctionTS(model: ModelInfo, sharedPackageName: string, connectorDef: ApiConnectorConfig, modelConnector: ApiModelConnectorConfig, authPolicy?: ModelAuthPolicy): string;
14
+ export declare function generateApiConnectorFunctionTS(model: ModelInfo, sharedPackageName: string, connectorDef: ApiConnectorConfig, modelConnector: ApiModelConnectorConfig, authPolicy?: ModelAuthPolicy, authProvider?: AuthProvider): string;
15
15
  /**
16
16
  * RDB コネクタ用 C# Azure Functions を生成
17
17
  */
@@ -1 +1 @@
1
- {"version":3,"file":"connector-functions-generator.d.ts","sourceRoot":"","sources":["../../../src/core/scaffold/connector-functions-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAA4B,MAAM,gBAAgB,CAAC;AACrE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EAChB,MAAM,aAAa,CAAC;AAKrB;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS,EAChB,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,uBAAuB,EACvC,UAAU,CAAC,EAAE,eAAe,GAC3B,MAAM,CA2JR;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS,EAChB,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,uBAAuB,EACvC,UAAU,CAAC,EAAE,eAAe,GAC3B,MAAM,CA0NR;AA4CD;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,uBAAuB,GACtC,MAAM,CAmIR;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,uBAAuB,GACtC,MAAM,CAsNR;AAqCD;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,uBAAuB,GACtC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAoF7C;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,uBAAuB,GACtC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAwI7C;AAgCD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,SAAS,kBAAkB,EAAE,GAAG,OAAO,CAGtF"}
1
+ {"version":3,"file":"connector-functions-generator.d.ts","sourceRoot":"","sources":["../../../src/core/scaffold/connector-functions-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAA4B,MAAM,gBAAgB,CAAC;AACrE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACb,MAAM,aAAa,CAAC;AAKrB;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS,EAChB,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,uBAAuB,EACvC,UAAU,CAAC,EAAE,eAAe,EAC5B,YAAY,CAAC,EAAE,YAAY,GAC1B,MAAM,CA2JR;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS,EAChB,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,uBAAuB,EACvC,UAAU,CAAC,EAAE,eAAe,EAC5B,YAAY,CAAC,EAAE,YAAY,GAC1B,MAAM,CA0NR;AA4CD;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,uBAAuB,GACtC,MAAM,CAmIR;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,uBAAuB,GACtC,MAAM,CAsNR;AAqCD;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,uBAAuB,GACtC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAoF7C;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,kBAAkB,EAChC,cAAc,EAAE,uBAAuB,GACtC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAwI7C;AAgCD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,SAAS,kBAAkB,EAAE,GAAG,OAAO,CAGtF"}
@@ -17,7 +17,7 @@ const auth_generator_1 = require("./auth-generator");
17
17
  /**
18
18
  * RDB コネクタ用 TypeScript Azure Functions を生成
19
19
  */
20
- function generateRdbConnectorFunctionTS(model, sharedPackageName, connectorDef, modelConnector, authPolicy) {
20
+ function generateRdbConnectorFunctionTS(model, sharedPackageName, connectorDef, modelConnector, authPolicy, authProvider) {
21
21
  const modelCamel = (0, model_parser_1.toCamelCase)(model.name);
22
22
  const schemaName = model.schemaName;
23
23
  const ops = new Set(modelConnector.operations);
@@ -110,7 +110,7 @@ function generateRdbConnectorFunctionTS(model, sharedPackageName, connectorDef,
110
110
  // Auth guard setup
111
111
  const hasAuth = !!authPolicy;
112
112
  const authImport = hasAuth ? `\n${(0, auth_generator_1.generateAuthImportTS)()}\n` : '';
113
- const readGuard = hasAuth ? `\n${(0, auth_generator_1.generateAuthGuardTS)(authPolicy, 'read')}\n` : '';
113
+ const readGuard = hasAuth ? `\n${(0, auth_generator_1.generateAuthGuardTS)(authPolicy, 'read', authProvider)}\n` : '';
114
114
  const authCatchBlock = hasAuth
115
115
  ? ` const authErr = handleAuthError(error);
116
116
  if (authErr) return authErr;\n `
@@ -128,7 +128,7 @@ ${getConnection}
128
128
  app.http('${modelCamel}-get-all', {
129
129
  methods: ['GET'],
130
130
  route: '${modelCamel}',
131
- authLevel: 'anonymous',
131
+ authLevel: 'function',
132
132
  handler: async (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> => {
133
133
  try {${readGuard}
134
134
  ${queryAll}
@@ -146,7 +146,7 @@ app.http('${modelCamel}-get-all', {
146
146
  app.http('${modelCamel}-get-by-id', {
147
147
  methods: ['GET'],
148
148
  route: '${modelCamel}/{id}',
149
- authLevel: 'anonymous',
149
+ authLevel: 'function',
150
150
  handler: async (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> => {
151
151
  try {${readGuard}
152
152
  const id = request.params.id;
@@ -167,7 +167,7 @@ app.http('${modelCamel}-get-by-id', {
167
167
  /**
168
168
  * API コネクタ用 TypeScript Azure Functions を生成
169
169
  */
170
- function generateApiConnectorFunctionTS(model, sharedPackageName, connectorDef, modelConnector, authPolicy) {
170
+ function generateApiConnectorFunctionTS(model, sharedPackageName, connectorDef, modelConnector, authPolicy, authProvider) {
171
171
  const modelCamel = (0, model_parser_1.toCamelCase)(model.name);
172
172
  const schemaName = model.schemaName;
173
173
  const ops = new Set(modelConnector.operations);
@@ -177,8 +177,8 @@ function generateApiConnectorFunctionTS(model, sharedPackageName, connectorDef,
177
177
  // Auth guard setup (user access control, separate from connector auth to external APIs)
178
178
  const hasAuth = !!authPolicy;
179
179
  const authImportLine = hasAuth ? `\n${(0, auth_generator_1.generateAuthImportTS)()}\n` : '';
180
- const readGuard = hasAuth ? `\n${(0, auth_generator_1.generateAuthGuardTS)(authPolicy, 'read')}\n` : '';
181
- const writeGuard = hasAuth ? `\n${(0, auth_generator_1.generateAuthGuardTS)(authPolicy, 'write')}\n` : '';
180
+ const readGuard = hasAuth ? `\n${(0, auth_generator_1.generateAuthGuardTS)(authPolicy, 'read', authProvider)}\n` : '';
181
+ const writeGuard = hasAuth ? `\n${(0, auth_generator_1.generateAuthGuardTS)(authPolicy, 'write', authProvider)}\n` : '';
182
182
  const authCatchBlock = hasAuth
183
183
  ? ` const authErr = handleAuthError(error);
184
184
  if (authErr) return authErr;\n `
@@ -201,7 +201,7 @@ ${authSetup.helperCode}
201
201
  app.http('${modelCamel}-get-all', {
202
202
  methods: ['GET'],
203
203
  route: '${modelCamel}',
204
- authLevel: 'anonymous',
204
+ authLevel: 'function',
205
205
  handler: async (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> => {
206
206
  try {${readGuard}
207
207
  const url = getBaseUrl() + '${epPath}';
@@ -234,7 +234,7 @@ app.http('${modelCamel}-get-all', {
234
234
  app.http('${modelCamel}-get-by-id', {
235
235
  methods: ['GET'],
236
236
  route: '${modelCamel}/{id}',
237
- authLevel: 'anonymous',
237
+ authLevel: 'function',
238
238
  handler: async (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> => {
239
239
  try {${readGuard}
240
240
  const id = request.params.id;
@@ -273,7 +273,7 @@ app.http('${modelCamel}-get-by-id', {
273
273
  app.http('${modelCamel}-create', {
274
274
  methods: ['POST'],
275
275
  route: '${modelCamel}',
276
- authLevel: 'anonymous',
276
+ authLevel: 'function',
277
277
  handler: async (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> => {
278
278
  try {${writeGuard}
279
279
  const body = await request.json();
@@ -310,7 +310,7 @@ app.http('${modelCamel}-create', {
310
310
  app.http('${modelCamel}-update', {
311
311
  methods: ['PUT'],
312
312
  route: '${modelCamel}/{id}',
313
- authLevel: 'anonymous',
313
+ authLevel: 'function',
314
314
  handler: async (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> => {
315
315
  try {${writeGuard}
316
316
  const id = request.params.id;
@@ -349,7 +349,7 @@ app.http('${modelCamel}-update', {
349
349
  app.http('${modelCamel}-delete', {
350
350
  methods: ['DELETE'],
351
351
  route: '${modelCamel}/{id}',
352
- authLevel: 'anonymous',
352
+ authLevel: 'function',
353
353
  handler: async (request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> => {
354
354
  try {${writeGuard}
355
355
  const id = request.params.id;
@@ -446,7 +446,7 @@ function generateRdbConnectorFunctionCSharp(model, connectorDef, modelConnector)
446
446
  methods += `
447
447
  [Function("${modelCamel}GetAll")]
448
448
  public async Task<HttpResponseData> GetAll(
449
- [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "${modelCamel}")] HttpRequestData request)
449
+ [HttpTrigger(AuthorizationLevel.Function, "get", Route = "${modelCamel}")] HttpRequestData request)
450
450
  {
451
451
  try
452
452
  {
@@ -480,7 +480,7 @@ function generateRdbConnectorFunctionCSharp(model, connectorDef, modelConnector)
480
480
  methods += `
481
481
  [Function("${modelCamel}GetById")]
482
482
  public async Task<HttpResponseData> GetById(
483
- [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "${modelCamel}/{id}")] HttpRequestData request,
483
+ [HttpTrigger(AuthorizationLevel.Function, "get", Route = "${modelCamel}/{id}")] HttpRequestData request,
484
484
  string id)
485
485
  {
486
486
  try
@@ -558,7 +558,7 @@ function generateApiConnectorFunctionCSharp(model, connectorDef, modelConnector)
558
558
  methods += `
559
559
  [Function("${modelCamel}GetAll")]
560
560
  public async Task<HttpResponseData> GetAll(
561
- [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "${modelCamel}")] HttpRequestData request)
561
+ [HttpTrigger(AuthorizationLevel.Function, "get", Route = "${modelCamel}")] HttpRequestData request)
562
562
  {
563
563
  try
564
564
  {
@@ -590,7 +590,7 @@ function generateApiConnectorFunctionCSharp(model, connectorDef, modelConnector)
590
590
  methods += `
591
591
  [Function("${modelCamel}GetById")]
592
592
  public async Task<HttpResponseData> GetById(
593
- [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "${modelCamel}/{id}")] HttpRequestData request,
593
+ [HttpTrigger(AuthorizationLevel.Function, "get", Route = "${modelCamel}/{id}")] HttpRequestData request,
594
594
  string id)
595
595
  {
596
596
  try
@@ -627,7 +627,7 @@ function generateApiConnectorFunctionCSharp(model, connectorDef, modelConnector)
627
627
  methods += `
628
628
  [Function("${modelCamel}Create")]
629
629
  public async Task<HttpResponseData> Create(
630
- [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "${modelCamel}")] HttpRequestData request)
630
+ [HttpTrigger(AuthorizationLevel.Function, "post", Route = "${modelCamel}")] HttpRequestData request)
631
631
  {
632
632
  try
633
633
  {
@@ -662,7 +662,7 @@ function generateApiConnectorFunctionCSharp(model, connectorDef, modelConnector)
662
662
  methods += `
663
663
  [Function("${modelCamel}Update")]
664
664
  public async Task<HttpResponseData> Update(
665
- [HttpTrigger(AuthorizationLevel.Anonymous, "put", Route = "${modelCamel}/{id}")] HttpRequestData request,
665
+ [HttpTrigger(AuthorizationLevel.Function, "put", Route = "${modelCamel}/{id}")] HttpRequestData request,
666
666
  string id)
667
667
  {
668
668
  try
@@ -695,7 +695,7 @@ function generateApiConnectorFunctionCSharp(model, connectorDef, modelConnector)
695
695
  methods += `
696
696
  [Function("${modelCamel}Delete")]
697
697
  public async Task<HttpResponseData> Delete(
698
- [HttpTrigger(AuthorizationLevel.Anonymous, "delete", Route = "${modelCamel}/{id}")] HttpRequestData request,
698
+ [HttpTrigger(AuthorizationLevel.Function, "delete", Route = "${modelCamel}/{id}")] HttpRequestData request,
699
699
  string id)
700
700
  {
701
701
  try