Edge Function authentication and authorization
epic-external-system-integration-configuration-backend-infrastructure-task-006 — Implement the authentication guard for incoming Edge Function invocations. Verify that callers are either the Sync Scheduler service role or an admin user with the integration_admin claim. Reject all unauthorized invocations with 401/403. Add organization-level scoping so an invocation for org A cannot trigger or read credentials for org B, enforcing strict multi-tenant isolation at the function boundary.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 1 - 540 tasks
Can start after Tier 0 completes
Handles integration between different epics or system components. Requires coordination across multiple development streams.
Implementation Notes
Implement guard as auth-guard.ts exporting a single async function verifyRequest(req: Request): Promise
The integration_admin claim lives in app_metadata.claims.integration_admin (set by Supabase admin API) — document this clearly so ops can grant/revoke without code changes. For service role detection, compare the Authorization header value to Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') using a constant-time comparison to prevent timing attacks. All credential vault queries must include AND org_id = $orgId as a WHERE clause parameter — never as a JavaScript filter applied after fetching all rows.
Testing Requirements
Unit tests: (1) missing Authorization header → 401; (2) malformed JWT → 401; (3) valid JWT without integration_admin claim → 403; (4) valid JWT with integration_admin claim for org A trying to invoke for org B → 403 org_scope_violation; (5) service role key → accepted; (6) valid JWT with correct org → guard passes, downstream function called. Use Supabase test JWT signing with known secret for unit tests. Integration test: deploy locally, invoke with real Supabase Auth tokens with and without integration_admin claim, verify response codes. Security test: attempt to pass org_id in payload that differs from JWT claim — verify rejection.
Supabase Edge Functions have cold start latency that can cause the first sync invocation after idle periods to fail or timeout when the external API has a short connection window, leading to missed scheduled syncs that go undetected.
Mitigation & Contingency
Mitigation: Configure Edge Function memory and implement a warm-up ping mechanism before heavy sync invocations. Set generous timeout values on the external API calls. Log all cold-start incidents for monitoring.
Contingency: If cold starts cause consistent sync failures, migrate the sync scheduler to a persistent Supabase cron job that pre-warms the function 30 seconds before the scheduled sync time.
The sync scheduler must execute jobs at predictable times for financial reporting accuracy. Drift in cron execution timing (due to Supabase infrastructure delays) could cause syncs to run at wrong times, leading to missing data in accounting exports or duplicate exports across reporting periods.
Mitigation & Contingency
Mitigation: Implement idempotency keys based on integration ID + scheduled period, so re-runs of a delayed sync cannot create duplicate exports. Log actual execution timestamps vs scheduled timestamps and alert on drift exceeding 5 minutes.
Contingency: If scheduler reliability is insufficient, integrate with a dedicated cron service (e.g., pg_cron on Supabase) for millisecond-precise scheduling, replacing the application-level scheduler.
Aggressive health monitoring ping frequency could trigger rate limiting on external APIs (especially Xledger and Dynamics), causing legitimate export calls to fail after the monitor exhausts the API's request quota.
Mitigation & Contingency
Mitigation: Use lightweight health check endpoints (HEAD requests or vendor-specific ping/status endpoints) rather than data requests. Set health check frequency to once per 15 minutes minimum. Implement exponential backoff after consecutive failures.
Contingency: If rate limiting occurs, disable active health monitoring for the affected integration type and switch to passive health detection (mark unhealthy only when a scheduled sync fails).