feat: introspection-mode token validation (CRAIG Plan F pattern)
Scope
Implement RFC 7662 introspection-based token validation as an alternative to local JWS validation. Unblocks IdPs that emit JWE-encrypted (kanidm), opaque (ZITADEL-opaque, Keycloak-lightweight-tokens), or encrypted-mode (authentik-encrypted) access tokens.
Acceptance
-
canopy_auth::IntrospectionClientposts bearer to issuer's introspection endpoint + caches claims - Per-service env var
CANOPY_<SVC>__TOKEN_VALIDATION_MODEselects strategy:jws | introspect | auto -
autodispatches on token shape (3 segments → JWS, 5 → JWE-via-introspection, no dots → opaque-via-introspection) - Five per-service knobs per CRAIG Plan F: endpoint, auth method, cache TTL, cache max entries, serve-on-outage
- CHANGELOG entry