feat(federation): mTLS AuthGuard with OID-based grant resolution (FED-M3-03) #509
Reference in New Issue
Block a user
Delete Branch "feat/federation-m3-auth-guard"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
FederationAuthGuard(CanActivate) for inbound federation API routes onapps/gateway1.3.6.1.4.1.99999.1(grantId) and1.3.6.1.4.1.99999.2(subjectUserId)getGrantWithPeer), assertsstatus === 'active', and validates cert serial against stored peer cert serial (defense-in-depth)FederationContexttorequest.federationContexton success@mosaicstack/types, not raw NestJS exceptionsFederationModuleproviders and exported for@UseGuards()in M3-05/06/07 verb controllersCloses #462
PRD AC-3 (cross-user isolation prerequisite): checked off -- the guard binds cert to grant to subjectUserId at the transport layer, preventing any cross-user data access by a peer that does not hold an active grant for the target user.
Key decisions
Cert-serial check: Kept. The stored
certSerialonfederation_peersis matched against the inbound cert serial. This is defense-in-depth: even if the mTLS CA is compromised or a TLS terminator forwards an arbitrary cert, the serial must match what was registered at enrollment. No additional DB round-trip needed (peer is loaded in the same join as the grant).FastifyRequest typing:
request.raw.sockettyped asPartial<tls.TLSSocket>-- presence ofgetPeerCertificateis checked at runtime, allowing safe fallback for plain HTTP connections in dev/test.OID helper location:
federation/oid.util.ts(not insideserver/) so it can be reused by future client-side verification without a circular dependency.Test plan
pnpm typecheck-- 38 package typecheck tasks passpnpm lint-- 21 lint tasks passpnpm format:check-- all files use Prettier code stylepnpm --filter @mosaicstack/gateway test-- 28 test files pass (450 tests), 5 skipped (DB integration)Generated with Claude Code
71c7b85026to0af3e218a1