Skip to content

Protect an Express App

Use @caracalai/express when an Express app should verify Caracal mandates before route handlers run.

  • A Caracal-mandate resource whose audience matches this service.
  • The zone STS issuer, zone ID, and a shared production revocation store.
  • A route-by-route scope and target map.
Terminal window
npm install express @caracalai/express @caracalai/verify @caracalai/revocation

Use a Redis-backed revocation store in production. The in-memory store is only suitable for local development and tests.

import express from 'express'
import { caracalAuth, type CaracalRequest } from '@caracalai/express'
import { createMandateVerifier } from '@caracalai/verify'
import { InMemoryRevocationStore } from '@caracalai/revocation'
const app = express()
const verifier = createMandateVerifier({
issuer: process.env.CARACAL_ISSUER!,
audience: 'resource://pipernet',
zoneId: process.env.CARACAL_ZONE_ID!,
revocations: new InMemoryRevocationStore(),
})
await verifier.warmup()
app.use(
'/reports',
caracalAuth(
{ verifier },
{
requiredScopes: ['pipernet:read'],
requiredTargets: ['resource://pipernet'],
},
),
)
app.get('/reports', (req: CaracalRequest, res) => {
res.json({
principal: req.caracalClaims?.sub,
reports: ['market-risk', 'quarterly'],
})
})

The middleware attaches verified claims to req.caracal and req.caracalClaims, plus the propagation context at req.caracalContext.

OptionUse it for
requiredScopesTool or route-level scope checks.
requiredTargetsResource-target checks.
requireSessionRequire a governed Session.
requireDelegationRequire delegated authority.
maxHopCountLimit delegation depth.
  1. Exchange for a mandate that targets the resource.
  2. Call the protected route with Authorization: Bearer <mandate>.
  3. Remove a required scope and confirm the route returns 403.
  4. Revoke the session and confirm the route rejects the old mandate.

Expected result: missing or invalid credentials return 401, valid but insufficient authority returns 403, and protected handlers run only after req.caracalClaims and req.caracalContext are populated.

For middleware option signatures, use Express Adapter reference.

Add route-specific requirements, then test the boundary with Test Caracal Integrations.