buildmymcpserver/apps/api
Marco Sadjadi b421457010
All checks were successful
Deploy to Production / deploy (push) Successful in 1m21s
fix(oauth): accept client_secret_basic on /oauth/token (RFC 6749 §2.3.1)
Sovereign-audit Phase 3 caught the next layer of the same bug:
form-urlencoded parsing now works, but the AS metadata advertises
both `client_secret_basic` and `client_secret_post` while the handler
only read credentials from the body. Claude Desktop (and most OAuth
SDKs) prefer Basic auth, so every token exchange landed at
"401 invalid_client" — visible in prod logs as POST /oauth/token from
160.79.106.37 returning 401 in <4ms (failing the missing-secret check).

Parse Authorization: Basic header, decode base64, percent-decode each
side (RFC 6749 §2.3.1 mandates pct-encoding of user/pass before the
base64 step), and treat the resulting credentials as if they came from
the body. Header takes precedence when both are present.
2026-05-28 21:28:23 +02:00
..
src fix(oauth): accept client_secret_basic on /oauth/token (RFC 6749 §2.3.1) 2026-05-28 21:28:23 +02:00
Dockerfile fix(docker): healthcheck must hit 127.0.0.1, not localhost 2026-05-21 18:07:01 +02:00
package.json feat(billing): Stripe Checkout + Customer Portal + signed webhook 2026-05-25 16:30:42 +02:00
tsconfig.json feat(api): Fastify control plane (auth, servers, WS build stream, OAuth 2.1 AS, JWKS) 2026-05-19 00:24:47 +02:00