docs: correct OIDC architecture framing for Login Flow v2
The previous round of review feedback rested on a misunderstanding — that the MCP server is "the OAuth issuer" under Login Flow v2 and that NEXTCLOUD_OIDC_CLIENT_ID/SECRET are external-IdP-only. Code says otherwise (app.py:619/625/703-717, unified_verifier.py:72): - The MCP server is an OIDC relying party of Nextcloud OIDC. Tokens are signed by Nextcloud and validated against Nextcloud's JWKS in all modes — the server has no private signing keys. - Static NEXTCLOUD_OIDC_CLIENT_ID/SECRET are the preferred way to register the MCP server as that relying party; RFC 7591 DCR is a fallback when both are unset. - Login Flow v2 layers per-user app-password acquisition on top — it governs the MCP→Nextcloud data leg, not the relying-party setup. This commit reverts the inaccuracies introduced by35c115eand reframes the original `login-flow-v2.md` to match what the code does: - login-flow-v2.md: revise "How It Works" to describe the MCP server as an OIDC RP + OAuth facade (not a standalone issuer); rename "OAuth Issuer Endpoints" → "OAuth Endpoints" with a note that those endpoints front Nextcloud OIDC; add NEXTCLOUD_OIDC_CLIENT_ID/SECRET to the required env vars with DCR documented as fallback. - running.md: restore the static-creds Docker example (deleted in35c115eon the wrong reasoning that it was tied to the retired direct-OAuth-to-Nextcloud flow); rewrite the OAuth Mode section intro to describe the actual relying-party + facade architecture. - configuration.md: fix Best Practices "For Production" to mention static creds as preferred / DCR as fallback; restore the .oauth Docker volume alongside data so DCR-registered MCP-client state and the encrypted app-password DB both persist. - auth-flows.md: drop the note added in35c115ethat wrongly claimed the MCP server validates Bearer tokens against its own JWKS under Login Flow v2 — it validates against Nextcloud's JWKS in all modes; reword the Login Flow v2 "Key characteristics" bullet that called the MCP server "the OAuth authorization server". Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
35c115ead6
commit
319e82774e
+18
-7
@@ -17,7 +17,7 @@ Before running the server:
|
||||
Start the server using Docker:
|
||||
|
||||
```bash
|
||||
# Login Flow v2 / OAuth issuer mode (--oauth, recommended for multi-user)
|
||||
# OAuth mode (--oauth, recommended for multi-user; required by Login Flow v2)
|
||||
docker run -p 127.0.0.1:8000:8000 --env-file .env --rm \
|
||||
ghcr.io/cbcoutinho/nextcloud-mcp-server:latest --oauth
|
||||
|
||||
@@ -26,7 +26,7 @@ docker run -p 127.0.0.1:8000:8000 --env-file .env --rm \
|
||||
ghcr.io/cbcoutinho/nextcloud-mcp-server:latest
|
||||
```
|
||||
|
||||
> **Note:** The `--oauth` flag turns on the OAuth-issuer layer used by [Login Flow v2](login-flow-v2.md), the recommended multi-user mode. It does **not** forward client OAuth tokens to Nextcloud — Nextcloud is always reached via per-user app passwords (Login Flow v2) or Basic Auth credentials.
|
||||
> **Note:** Under `--oauth` the MCP server is an **OIDC relying party of Nextcloud OIDC** (validates client Bearer tokens against Nextcloud's JWKS) and exposes an OAuth facade for MCP clients. It does **not** forward client OAuth tokens to Nextcloud — Nextcloud is always reached via per-user app passwords ([Login Flow v2](login-flow-v2.md)) or Basic Auth credentials.
|
||||
|
||||
The server will start on `http://127.0.0.1:8000` by default.
|
||||
|
||||
@@ -36,20 +36,31 @@ The server will start on `http://127.0.0.1:8000` by default.
|
||||
|
||||
### Basic Docker Run
|
||||
|
||||
#### Login Flow v2 / OAuth issuer mode (`--oauth`)
|
||||
#### OAuth Mode (`--oauth`, recommended for multi-user)
|
||||
|
||||
Recommended for multi-user deployments. The MCP server acts as the OAuth issuer for MCP clients; per-user Nextcloud access is obtained via [Login Flow v2](login-flow-v2.md) and stored as encrypted app passwords.
|
||||
The `--oauth` flag turns on the OAuth/OIDC layer. In this mode the MCP server is an **OIDC relying party of Nextcloud OIDC** (it validates Bearer tokens against Nextcloud's JWKS) and exposes an OAuth facade for MCP clients. [Login Flow v2](login-flow-v2.md) is layered on top to acquire and store per-user Nextcloud app passwords.
|
||||
|
||||
The MCP server registers itself with Nextcloud's OIDC provider in one of two ways:
|
||||
|
||||
- **Static client (preferred)** — set `NEXTCLOUD_OIDC_CLIENT_ID` and `NEXTCLOUD_OIDC_CLIENT_SECRET` in `.env` (matching a client you registered in Nextcloud admin → OIDC).
|
||||
- **Dynamic Client Registration (fallback)** — if the static creds aren't set and Nextcloud advertises a `registration_endpoint`, the server self-registers via RFC 7591.
|
||||
|
||||
```bash
|
||||
# OAuth issuer with DCR (Dynamic Client Registration)
|
||||
# OAuth with static (pre-registered) client — preferred
|
||||
docker run -p 127.0.0.1:8000:8000 --env-file .env --rm \
|
||||
-e NEXTCLOUD_OIDC_CLIENT_ID=abc123 \
|
||||
-e NEXTCLOUD_OIDC_CLIENT_SECRET=xyz789 \
|
||||
ghcr.io/cbcoutinho/nextcloud-mcp-server:latest --oauth
|
||||
|
||||
# OAuth with auto-registration (DCR) — used when static creds are absent
|
||||
docker run -p 127.0.0.1:8000:8000 --env-file .env --rm \
|
||||
ghcr.io/cbcoutinho/nextcloud-mcp-server:latest --oauth
|
||||
|
||||
# OAuth issuer on a custom port
|
||||
# OAuth on a custom port
|
||||
docker run -p 127.0.0.1:8080:8000 --env-file .env --rm \
|
||||
ghcr.io/cbcoutinho/nextcloud-mcp-server:latest --oauth
|
||||
|
||||
# OAuth issuer with specific apps only
|
||||
# OAuth with specific apps only
|
||||
docker run -p 127.0.0.1:8000:8000 --env-file .env --rm \
|
||||
ghcr.io/cbcoutinho/nextcloud-mcp-server:latest --oauth \
|
||||
--enable-app notes --enable-app calendar
|
||||
|
||||
Reference in New Issue
Block a user