@nyuro/identity-jwks
v0.3.0
Published
Generic JWT verifier for Nyuro services: pinned algorithm, mandatory iss + aud, JWKS cache with unknown-kid refetch and cooldown. Verifies the auth service's per-product tokens.
Readme
@nyuro/identity-jwks
Server-side verification of the per-product access tokens minted by the Nyuro auth service
(apps/auth, spec docs/specs/AUTH-MIGRATION-SPEC.md §4.1); generic for any JWKS issuer.
@nyuro/identity-clerk is unchanged.
const verifier = createIdentityTokenVerifier({
issuer: 'https://auth.nyuro.ai',
audience: 'https://flow.nyuro.ai', // this service only
jwksUrl: 'https://auth.nyuro.ai/api/auth/jwks'
})
const claims = await verifier.verify(bearer) // TokenRejectedError → 401, JwksUnavailableError → 503Enforces one pinned algorithm (EdDSA default), byte-exact iss, aud equal to this service as a
single string, exp/nbf/iat with skew (5 s), lifetime ≤ 600 s, and the claims contract
(org and org_role together or both absent: a user without an org has no org). The
JWKS cache refetches on an unknown kid at most once per cooldown (30 s), keeps cached keys when a
refresh fails and fails closed when it never loaded. A verifier inside its cooldown rejects the
first token of a just-rotated key until the cooldown ends; clients retry once on 401.
Tests: verify the shared fixture contracts/examples/identity-tokens/v1.json (also shipped as
@nyuro/contracts/fixtures/identity-tokens/v1.json) with jwks: fx.jwks and now: () => fx.now * 1000.
