feat(backend): Add Frontend API proxy helpers#7602
Conversation
…s, and @clerk/express Implement clerkProxy helper that abstracts away the complexity of proxying Clerk's Frontend API (FAPI) requests. This enables scenarios where direct communication with Clerk's API is blocked or needs to go through the application server. - Core proxy implementation in @clerk/backend/src/proxy.ts with environment-aware URL derivation - Next.js integration via clerkMiddleware frontendApiProxy option and route handlers - Express middleware for handling proxy requests with body streaming support - FAPI URL constants added to @clerk/shared for environment detection Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
|
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
- Add comprehensive tests for @clerk/backend/proxy including FAPI URL derivation, path matching, and request forwarding - Add tests for @clerk/nextjs/proxy route handlers and exports - Add tests for @clerk/express/proxy middleware and request conversion Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The Next.js proxy tests mocked the underlying @clerk/backend/proxy, making them essentially test that wrapper A calls function B - no real behavior was verified. The backend proxy tests provide actual coverage. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Allow the `enabled` option in `frontendApiProxy` to accept a function `(url: URL) => boolean` for conditional proxy based on the request URL. This enables scenarios where an application has multiple domains and only some require proxying (e.g., `foo.replit.app` proxied while `foo.com` uses direct FAPI access). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add X-Forwarded-Host and X-Forwarded-Proto headers for proxy awareness - Preserve existing X-Forwarded-* headers from upstream proxies - Rewrite Location headers for FAPI redirects to go through the proxy - Add tests for new header handling and redirect rewriting Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…t.js - Remove separate @clerk/express/proxy entry point and middleware - Embed proxy handling directly in Express clerkMiddleware - Auto-derive proxyUrl from frontendApiProxy config for handshake redirects - Add FrontendApiProxyOptions type with enabled and path options - Align API structure between Express and Next.js SDKs - Remove low-value constant tests Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Change from defaulting enabled to true, to requiring explicit enabled: true - Update tests to use enabled: true - Update JSDoc to remove default annotation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
packages/backend/src/proxy.ts
Outdated
| export function matchProxyPath(request: Request, options?: Pick<FrontendApiProxyOptions, 'proxyPath'>): boolean { | ||
| const proxyPath = options?.proxyPath || DEFAULT_PROXY_PATH; | ||
| const url = new URL(request.url); | ||
| return url.pathname.startsWith(proxyPath); |
There was a problem hiding this comment.
Should we check for an exact match or a / boundary here? startsWith alone means something like /__clerk-admin would incorrectly match the default /__clerk prefix.
return url.pathname === proxyPath || url.pathname.startsWith(proxyPath + '/');Fixes issue where paths like /__clerk-admin would incorrectly match the /__clerk proxy path. Now requires either an exact match or a trailing slash boundary. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Ensures that proxy paths like /__clerk/ work correctly by stripping trailing slashes before matching. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Express types these headers as string | string[] | undefined. Take the first element when they're arrays to avoid malformed URLs. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…bpath - Remove @clerk/nextjs/proxy subpath export - Re-export proxy functions from @clerk/nextjs/server - Update JSDoc examples to use new import path Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replaces /\/+$/ regex with a simple while loop to avoid ReDoS concerns flagged by GitHub Advanced Security code scanning. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Description
Adds Frontend API proxy support to
clerkMiddlewarefor both Next.js and Express. This enables scenarios where direct communication with Clerk's API is blocked or needs to go through the application server.API
Next.js
Express
Key Features
clerkMiddlewareproxyUrlfor handshake redirects is automatically derived from thefrontendApiProxyconfigenabledto conditionally enable proxy based on request URLType of change
Testing