Skip to content

Release v2.3.0 — OAuth 2.1 for claude.ai web + Claude Desktop#24

Merged
syswave-dev merged 22 commits into
mainfrom
release/v2.3.0
May 11, 2026
Merged

Release v2.3.0 — OAuth 2.1 for claude.ai web + Claude Desktop#24
syswave-dev merged 22 commits into
mainfrom
release/v2.3.0

Conversation

@syswave-dev
Copy link
Copy Markdown
Collaborator

Summary

What's in the diff

  • lib/oauth/ — new module (tokens, store, pkce, pages, rate-limit, index)
  • server.js — wires OAuth setup before createApp(...) when OAUTH_JWT_SECRET is set; recipe-engine bootstrap from v2.2 is preserved
  • lib/auth.js — middleware accepts JWT bearer tokens via injected verifier
  • lib/cache.js — adds oauth_clients, oauth_auth_codes, oauth_refresh_tokens tables alongside the v2.2 meta table
  • test/oauth-*.test.js + test/integration-oauth.test.js — full coverage for PKCE, store, DCR, authorize, token, revoke, CORS, rate-limit, middleware, and end-to-end DCR → authorize → consent → token → API → refresh
  • CHANGELOG.md, MIGRATION.md, README.md, .env.example — docs

Tag policy

:latest Docker tag stays pinned to v1.2.x. v2.3.0 will be published as aeternalabshq/pullmd:2.3.0, :2.3, :2 (Docker Hub + GHCR, multi-arch). The :latest flip remains decoupled from this release.

Test plan

  • CI green on the PR (multi-arch builds for all three images succeed)
  • node --test green locally (558/558 passing)
  • After merge + tag, smoke-test live aegis instance: discovery endpoints + claude.ai web connector + Claude Desktop connector

🤖 Generated with Claude Code

syswave-dev and others added 22 commits May 2, 2026 18:42
…s tables

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ha256 hashing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…with rotation + chain invalidation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…eware

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…7591)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…6 and EXACT redirect-URI match

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… refresh token mint

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ection

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds setAccessTokenVerifier() to createAuth so the OAuth layer can wire
in async JWT verification without a circular dependency. Non-pmd_ bearers
go through the verifier first, then fall through to legacy token lookup.
…S metadata

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…r MCP clients

Inspector + claude.ai web run in the browser, so cross-origin fetch to the
OAuth token endpoint was blocked (TypeError: Failed to fetch). Wildcard
origin is correct here — MCP clients have unknown origins by definition.
Allow-Credentials stays unset (Bearer tokens travel via Authorization header,
not cookies) and combining wildcard origin with credentials is forbidden by
the spec anyway.

Phase-1 endpoints (/api/*, /login, /settings) deliberately untouched, plus
/oauth/authorize which is a top-level browser redirect, not a fetch source.
Brings the OAuth-2.1 Authorization Code stack (PKCE-S256, DCR, JWT
access tokens, opaque rotating refresh tokens, RFC 8414/9728/7591/7009
discovery + lifecycle) onto the v2.x line on top of the multi-user and
recipe-engine work that landed in v2.0/v2.1/v2.2.

OAuth is opt-in via OAUTH_JWT_SECRET. Without it, behavior is identical
to v2.2.x.

Closes #6, #10.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- .env.example: OAuth section was labeled "new in v2.1" (carry-over from feat/oauth); ships in v2.3
- MIGRATION.md: remove redundant bottom OAuth section; v2.2.x → v2.3.0 path at top is canonical

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@syswave-dev syswave-dev merged commit a0e65c6 into main May 11, 2026
3 checks passed
@syswave-dev syswave-dev deleted the release/v2.3.0 branch May 11, 2026 10:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Architecture: Phase 2 - OAuth authorization code flow for claude.ai web connector

1 participant