This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
securitycritical PriorityID: openid-sse-caep-realtime-session-revocation

OpenID SSE-CAEP Real-Time Revocation and Continuous Access Enforcement

Enforces deterministic sub-second session and token invalidation across distributed architectures by ingesting OpenID Continuous Access Evaluation Profile (CAEP) and Shared Signals and Events (SSE) Security Event Tokens (SETs, RFC 8417). Prohibits relying purely on passive JWT time-to-live (TTL) expiration for authorization state when credential compromise or revocation events occur.

Prohibited Anti-Pattern: Passive JWT Expiration Reliance Without Active Shared Signal Revocation Ingestion

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: OpenID SSE-CAEP Real-Time Revocation and Continuous Access Enforcement - Enforces deterministic sub-second session and token invalidation across distributed architectures by ingesting OpenID Continuous Access Evaluation Profile (CAEP) and Shared Signals and Events (SSE) Security Event Tokens (SETs, RFC 8417). Prohibits relying purely on passive JWT time-to-live (TTL) expiration for authorization state when credential compromise or revocation events occur.
globs: src/auth/**/*.{ts,tsx}, src/middleware/**/*.{ts,tsx}, src/security/**/*.{ts,tsx}, src/events/**/*.{ts,tsx}
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/openid-sse-caep-realtime-session-revocation"
---

# OpenID SSE-CAEP Real-Time Revocation and Continuous Access Enforcement

> **Severity**: CRITICAL | **Category**: security
> **Anti-Pattern Warning**: Passive JWT Expiration Reliance Without Active Shared Signal Revocation Ingestion

## System Constraints
You are a Principal Security Architect enforcing the OpenID Shared Signals and Events (SSE) and Continuous Access Evaluation Profile (CAEP) standards. You strictly reject implementations that assume JWT tokens are valid simply because their cryptographic signature and 'exp' claim pass. You mandate that all distributed microservices and API gateways implement real-time event-driven session revocation listeners, verify incoming Security Event Tokens (RFC 8417) cryptographically against the Identity Provider's JWKS, and query an ultra-low-latency distributed revocation registry (e.g., Redis cluster) on every authenticated request.

## Strict Guidelines
- Engineers MUST ALWAYS verify the digital signature, issuer (iss), audience (aud), and timestamp (iat) of incoming CAEP Security Event Tokens (SETs) using the IdP's dedicated JWKS endpoint before processing events.
- Engineers MUST NOT rely solely on passive JWT 'exp' expiration intervals for mitigating credential compromise or session termination; an explicit revocation check is mandatory.
- Services MUST ingest CAEP event types including 'https://schemas.openid.net/secevent/caep/event-type/session-revoked' and 'https://schemas.openid.net/secevent/caep/event-type/credential-change' to invalidate active sessions deterministically in < 1000ms.
- Revocation states MUST be written to an ultra-low-latency cache (Redis, Dragonfly, or distributed memory store) keyed by subject identifier ('sub'), session identifier ('sid'), or token identifier ('jti') with TTL matched to the maximum remaining lifetime of any active access token.
- Auth verification middlewares MUST execute an asynchronous, pipeline-optimized revocation lookup on every incoming Bearer token against the CAEP state before allowing request processing.
- Webhook receivers for SSE streams MUST return HTTP 202 Accepted only after persistent durable storage or buffer queuing of the SET to prevent event loss during receiver restarts.

## Bad vs Good Implementations
### CAEP SET Processing and Revocation Verification Middleware

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: The middleware performs basic stateless verification. It fails to check any revocation registry populated by OpenID CAEP/SSE events. Stolen or compromised credentials remain fully functional until the JWT naturally expires.
```typescript
import { Request, Response, NextFunction } from 'express';
import jwt from 'jsonwebtoken';

const JWT_SECRET = process.env.JWT_SECRET || 'secret';

// ANTI-PATTERN: Completely ignores CAEP revocation signals.
// If an admin revokes a session or a credential is compromised,
// this token remains valid until `exp` elapses (e.g., up to 1 hour).
export function authenticateToken(req: Request, res: Response, next: NextFunction) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];

  if (!token) {
    return res.status(401).json({ error: 'Missing token' });
  }

  jwt.verify(token, JWT_SECRET, (err, user) => {
    if (err) {
      return res.status(403).json({ error: 'Invalid or expired token' });
    }
    req.user = user;
    next();
  });
}
```

#### Production Standard (Correct)
> **Standard**: Implements RFC 8417 SET verification against the IdP JWKS endpoint, extracts CAEP session-revoked and credential-change events, persists the revocations to Redis, and incorporates sub-millisecond revocation verification in the authorization middleware.
```typescript
import { Request, Response, NextFunction } from 'express';
import * as jose from 'jose';
import Redis from 'ioredis';

const redis = new Redis(process.env.REDIS_REVOCATION_URL!);
const JWKS = jose.createRemoteJWKSet(new URL(process.env.IDP_JWKS_URL!));

interface CaepClaims extends jose.JWTPayload {
  sid?: string;
  sub: string;
}

/**
 * Deterministically invalidates session context via verified CAEP Event
 */
export async function handleCaepWebhook(rawSet: string): Promise<void> {
  // 1. Verify SET signature & claims according to RFC 8417
  const { payload } = await jose.jwtVerify(rawSet, JWKS, {
    issuer: process.env.IDP_ISSUER_URL,
    audience: process.env.SSE_RECEIVER_AUDIENCE,
  });

  const events = payload.events as Record<string, any>;
  const sessionRevoked = events['https://schemas.openid.net/secevent/caep/event-type/session-revoked'];
  const credentialChange = events['https://schemas.openid.net/secevent/caep/event-type/credential-change'];

  if (sessionRevoked) {
    const sub = sessionRevoked.subject?.sub || payload.sub;
    const sid = sessionRevoked.subject?.sid;
    const ttl = Number(process.env.MAX_TOKEN_LIFETIME_SECONDS || 3600);

    if (sid) await redis.setex(`revoked:sid:${sid}`, ttl, 'revoked');
    if (sub) await redis.setex(`revoked:sub:${sub}`, ttl, 'revoked');
  } else if (credentialChange) {
    const sub = credentialChange.subject?.sub || payload.sub;
    const ttl = Number(process.env.MAX_TOKEN_LIFETIME_SECONDS || 3600);
    if (sub) await redis.setex(`revoked:sub:${sub}`, ttl, 'revoked');
  }
}

/**
 * Auth middleware with sub-second revocation check against CAEP cache
 */
export async function authenticateToken(req: Request, res: Response, next: NextFunction) {
  const token = req.headers['authorization']?.replace(/^Bearer\s+/, '');
  if (!token) return res.status(401).json({ error: 'Missing Bearer token' });

  try {
    const { payload } = await jose.jwtVerify<CaepClaims>(token, JWKS, {
      issuer: process.env.IDP_ISSUER_URL,
      audience: process.env.API_AUDIENCE,
    });

    // Sub-millisecond lookup in revocation registry populated by CAEP
    const pipeline = redis.pipeline();
    if (payload.sid) pipeline.exists(`revoked:sid:${payload.sid}`);
    if (payload.sub) pipeline.exists(`revoked:sub:${payload.sub}`);
    const results = await pipeline.exec();

    const isRevoked = results?.some(([err, count]) => !err && (count as number) > 0);
    if (isRevoked) {
      return res.status(401).json({ error: 'Session has been revoked via CAEP signal' });
    }

    req.user = payload;
    next();
  } catch (err) {
    return res.status(401).json({ error: 'Unauthorized or token invalid' });
  }
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: OpenID SSE-CAEP Real-Time Revocation and Continuous Access Enforcement

OpenID SSE-CAEP Real-Time Revocation and Continuous Access Enforcement defines an industrial-grade behavioral standard for security engineering. Enforces deterministic sub-second session and token invalidation across distributed architectures by ingesting OpenID Continuous Access Evaluation Profile (CAEP) and Shared Signals and Events (SSE) Security Event Tokens (SETs, RFC 8417). Prohibits relying purely on passive JWT time-to-live (TTL) expiration for authorization state when credential compromise or revocation events occur. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Passive JWT Expiration Reliance Without Active Shared Signal Revocation Ingestion Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftPassive JWT Expiration Reliance Without Active Shared Signal Revocation IngestionCritical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS verify the digital signature, issuer (iss), audience (aud), and timestamp (iat) of incoming CAEP Security Event Tokens (SETs) using the IdP's dedicated JWKS endpoint before processing events.

Engineers MUST ALWAYS verify the digital signature, issuer (iss), audience (aud), and timestamp (iat) of incoming CAEP Security Event Tokens (SETs) using the IdP's dedicated JWKS endpoint before processing events.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST NOT rely solely on passive JWT 'exp' expiration intervals for mitigating credential compromise or session termination

Engineers MUST NOT rely solely on passive JWT 'exp' expiration intervals for mitigating credential compromise or session termination; an explicit revocation check is mandatory.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Services MUST ingest CAEP event types including 'https

Services MUST ingest CAEP event types including 'https://schemas.openid.net/secevent/caep/event-type/session-revoked' and 'https://schemas.openid.net/secevent/caep/event-type/credential-change' to invalidate active sessions deterministically in < 1000ms.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Revocation states MUST be written to an ultra-low-latency cache (Redis, Dragonfly, or distributed memory store) keyed by subject identifier ('sub'), session identifier ('sid'), or token identifier ('jti') with TTL matched to the maximum remaining lifetime of any active access token.

Revocation states MUST be written to an ultra-low-latency cache (Redis, Dragonfly, or distributed memory store) keyed by subject identifier ('sub'), session identifier ('sid'), or token identifier ('jti') with TTL matched to the maximum remaining lifetime of any active access token.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Auth verification middlewares MUST execute an asynchronous, pipeline-optimized revocation lookup on every incoming Bearer token against the CAEP state before allowing request processing.

Auth verification middlewares MUST execute an asynchronous, pipeline-optimized revocation lookup on every incoming Bearer token against the CAEP state before allowing request processing.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
6

Webhook receivers for SSE streams MUST return HTTP 202 Accepted only after persistent durable storage or buffer queuing of the SET to prevent event loss during receiver restarts.

Webhook receivers for SSE streams MUST return HTTP 202 Accepted only after persistent durable storage or buffer queuing of the SET to prevent event loss during receiver restarts.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is OpenID SSE-CAEP Real-Time Revocation and Continuous Access Enforcement critical for AI coding assistants?

Enforces deterministic sub-second session and token invalidation across distributed architectures by ingesting OpenID Continuous Access Evaluation Profile (CAEP) and Shared Signals and Events (SSE) Security Event Tokens (SETs, RFC 8417). Prohibits relying purely on passive JWT time-to-live (TTL) expiration for authorization state when credential compromise or revocation events occur. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Passive JWT Expiration Reliance Without Active Shared Signal Revocation Ingestion) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

1 Rule in Stack

OpenID