What to build
Implement jotsmith token verify <jwt> [--aud <expected>] [--sub <expected>] per PRD §6.3 — a live HTTPS round-trip that fetches the discovery doc and JWKS, reconstructs the RSA public key, verifies the signature, and checks standard claims with ±60s skew. Demonstrates the issuer/JWKS-fetch path independently from minting.
This slice does NOT require setup at the code-dependency level (you could verify someone else's token), but to demo it meaningfully you need an issuer to verify against, so it's blocked by #7.
Acceptance criteria
Blocked by
Originally created in OpenCode session ID: ses_17ca8efd8ffexLcFSysAMDVNBQ
What to build
Implement
jotsmith token verify <jwt> [--aud <expected>] [--sub <expected>]per PRD §6.3 — a live HTTPS round-trip that fetches the discovery doc and JWKS, reconstructs the RSA public key, verifies the signature, and checks standard claims with ±60s skew. Demonstrates the issuer/JWKS-fetch path independently from minting.This slice does NOT require
setupat the code-dependency level (you could verify someone else's token), but to demo it meaningfully you need an issuer to verify against, so it's blocked by #7.Acceptance criteria
kid; rejects unsigned tokens or tokens withalgother thanRS256<issuer>/.well-known/openid-configuration(issuer from config); validates the discovery doc'sissuerfield equals the configissuerjwks_urifrom the discovery doc; finds the JWK matching the JWT headerkid; rejects if nonenande; verifies the signature using RS256issmatches config;exp > now,nbf <= now,iat <= now + skew; ±60s skew on all time checks--aud(if given) checks payloadaudcontains the value (when array) or equals it (when string)--sub(if given) requires exact match against payloadsubOK+ decoded claims to stderr (nothing to stdout); exit 0//go:build integrationmints and then verifies an end-to-end tokenBlocked by
token mintv1Originally created in OpenCode session ID: ses_17ca8efd8ffexLcFSysAMDVNBQ