fix(auth): cache Clerk JWKS instead of nil-panic on fetch failure#3301
Conversation
|
Warning Review limit reached
Next review available in: 18 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
Walkthrough
ChangesLazy JWKS keyfunc caching
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
getJWTKeyFunc handled a failed JWKS fetch with logger.Fatalf, but the slog logger's Fatalf only logs and does not os.Exit. Execution fell through to `return jwks.Keyfunc` with a nil *keyfunc.JWKS, which later panicked inside ParseWithClaims -> (*JWKS).getKey on a nil receiver. So a transient network blip to Clerk crashed request goroutines and the OIDC callback. It was also called from parseJWTToken on every Clerk-authenticated request, so each request did a synchronous JWKS HTTP fetch and spawned a background-refresh goroutine that lived forever (per-request fetch + goroutine leak). Build the JWKS once and reuse it via a pointer-held jwksCache (shared across ClerkHandler value-receiver copies). Failed fetches are not cached, so a transient outage retries on the next request instead of poisoning the handler, and degrades to the existing logged-error/401 path instead of panicking. Key rotation is still handled by keyfunc's RefreshUnknownKID + hourly refresh against the single long-lived instance.
623d042 to
e3432d4
Compare
Problem
A transient network blip reaching Clerk's JWKS endpoint (
context deadline exceededfetching.../.well-known/jwks.json) caused a nil-pointer panic in the auth flow, taking down request goroutines and the OIDC callback: