@@ -15,7 +15,7 @@ import { auditRoutes } from './routes/audit';
1515import enterpriseIntegrationRoutes , { oidcPublicRouter } from './routes/enterprise/integration' ;
1616import enterpriseComplianceRoutes from './routes/enterprise/compliance' ;
1717import { authMiddleware } from './middleware/auth' ;
18- import { createRateLimiter } from './middleware/rateLimit' ;
18+ import { createRateLimiter , extractPrincipalRateLimitIdentifier } from './middleware/rateLimit' ;
1919import {
2020 checkedProductionSafetyControls ,
2121 collectProductionSafetyViolations ,
@@ -175,6 +175,18 @@ const apiRouteLimiter = createRateLimiter({
175175 keyPrefix : 'rl:api-route' ,
176176} ) ;
177177
178+ function createAuthenticatedPrincipalLimiter (
179+ keyPrefix : string ,
180+ maxRequests : number ,
181+ ) {
182+ return createRateLimiter ( {
183+ windowMs : 60_000 ,
184+ maxRequests,
185+ keyPrefix,
186+ keyExtractor : extractPrincipalRateLimitIdentifier ,
187+ } ) ;
188+ }
189+
178190const REQUEST_ID_PATTERN = / ^ [ A - Z a - z 0 - 9 . _ : - ] { 1 , 128 } $ / ;
179191
180192function resolveRequestId ( value : unknown ) : string {
@@ -339,18 +351,24 @@ app.use('/api', globalLimiter);
339351// ---------------------------------------------------------------------------
340352// API routes
341353// ---------------------------------------------------------------------------
354+ const credentialPrincipalLimiter = createAuthenticatedPrincipalLimiter ( 'rl:principal:credentials' , 30 ) ;
355+ const verificationPrincipalLimiter = createAuthenticatedPrincipalLimiter ( 'rl:principal:verification' , 60 ) ;
356+ const governancePrincipalLimiter = createAuthenticatedPrincipalLimiter ( 'rl:principal:governance' , 30 ) ;
357+ const auditPrincipalLimiter = createAuthenticatedPrincipalLimiter ( 'rl:principal:audit' , 30 ) ;
358+
342359app . use ( '/api/v1/identity' , apiRouteLimiter , identityRoutes ) ;
343- app . use ( '/api/v1/credentials' , apiRouteLimiter , authMiddleware , credentialRoutes ) ;
344- app . use ( '/api/v1/verification' , apiRouteLimiter , authMiddleware , verificationRoutes ) ;
345- app . use ( '/api/v1/governance' , apiRouteLimiter , authMiddleware , governanceRoutes ) ;
346- app . use ( '/api/v1/audit' , apiRouteLimiter , authMiddleware , auditRoutes ) ;
360+ app . use ( '/api/v1/credentials' , apiRouteLimiter , authMiddleware , credentialPrincipalLimiter , credentialRoutes ) ;
361+ app . use ( '/api/v1/verification' , apiRouteLimiter , authMiddleware , verificationPrincipalLimiter , verificationRoutes ) ;
362+ app . use ( '/api/v1/governance' , apiRouteLimiter , authMiddleware , governancePrincipalLimiter , governanceRoutes ) ;
363+ app . use ( '/api/v1/audit' , apiRouteLimiter , authMiddleware , auditPrincipalLimiter , auditRoutes ) ;
347364
348365// Enterprise routes — mounted behind auth + stricter rate limit
349366const enterpriseLimiter = createRateLimiter ( {
350367 windowMs : 60_000 ,
351368 maxRequests : 30 ,
352369 keyPrefix : 'rl:enterprise' ,
353370} ) ;
371+ const enterprisePrincipalLimiter = createAuthenticatedPrincipalLimiter ( 'rl:principal:enterprise' , 30 ) ;
354372
355373// OIDC public routes — discovery, JWKS, and token endpoints MUST be accessible
356374// without a bearer token per OpenID Connect Discovery §4 and OAuth 2.0 §3.2.
@@ -363,8 +381,8 @@ const oidcPublicLimiter = createRateLimiter({
363381app . use ( '/api/v1/enterprise' , oidcPublicLimiter , oidcPublicRouter ) ;
364382
365383// Auth-gated enterprise routes (registration, authorize, userinfo, webhooks, etc.)
366- app . use ( '/api/v1/enterprise' , enterpriseLimiter , authMiddleware , enterpriseIntegrationRoutes ) ;
367- app . use ( '/api/v1/enterprise/compliance' , enterpriseLimiter , authMiddleware , enterpriseComplianceRoutes ) ;
384+ app . use ( '/api/v1/enterprise' , enterpriseLimiter , authMiddleware , enterprisePrincipalLimiter , enterpriseIntegrationRoutes ) ;
385+ app . use ( '/api/v1/enterprise/compliance' , enterpriseLimiter , authMiddleware , enterprisePrincipalLimiter , enterpriseComplianceRoutes ) ;
368386
369387const { aiComplianceRoutes } = require ( './routes/ai/compliance' ) as typeof import ( './routes/ai/compliance' ) ;
370388const { aiAgentIdentityRoutes } = require ( './routes/ai/agent-identity' ) as typeof import ( './routes/ai/agent-identity' ) ;
0 commit comments