Stack di test per validare questo flusso:
- Claude Desktop fa OAuth2 verso Authentik.
- Authentik riceve la richiesta verso un Proxy Provider.
- Un Proxy Property Mapping legge un attributo utente (
context9_token). - Authentik inietta
Authorization: Bearer <token>verso backend MCP (qui mockato concontext9-mock).
- Docker + Docker Compose plugin.
- Un Cloudflare Tunnel già creato con route DNS verso
auth.example.com(o tuo dominio). - Un token tunnel (
CLOUDFLARE_TUNNEL_TOKEN).
cp .env.example .env
# modifica .env con valori reali
docker compose up -dAuthenik sarà disponibile internamente su:
http://localhost:9000https://localhost:9443
L'accesso pubblico deve avvenire tramite AUTHENTIK_HOST_BROWSER (es. https://auth.example.com).
docker compose exec authentik-server ak create_admin_group
docker compose exec authentik-server ak create_user --username adminPoi apri AUTHENTIK_HOST_BROWSER e completa setup/login.
In Authentik:
- Crea un
Applicationchiamatoclaude-desktop-mcp. - Crea un
Providerdi tipoOAuth2/OpenIDcon:Client type:PublicAuthorization flow: con PKCE abilitato- Redirect URI: quello usato da Claude Desktop (in base alla versione)
- Collega provider e application.
Annota:
client_idauthorization_endpoint(tipicamentehttps://auth.example.com/application/o/authorize/)token_endpoint(tipicamentehttps://auth.example.com/application/o/token/)
- Crea un
Providerdi tipoProxycon upstreamhttp://context9-mock:8080. - Associa un FQDN dedicato (es.
mcp.example.com) tramite Cloudflare Tunnel. - Crea un'
Applicationper il proxy.
Per ogni utente, imposta un attributo custom:
- key:
context9_token - value:
<token personale dell'utente>
Crea un Proxy Property Mapping (Expression Policy / mapping Python) che setta l'header:
# Proxy property mapping expression
user_token = request.user.attributes.get("context9_token")
if user_token:
return {
"headers": {
"Authorization": f"Bearer {user_token}"
}
}
return {}Associa il mapping al Proxy Provider.
Con utente autenticato al proxy, chiama endpoint mock e controlla header inoltrati:
curl -i https://mcp.example.com/Il backend mock (context9-mock) espone nel body gli header ricevuti: verifica che compaia Authorization: Bearer ....
Apri Settings → Connectors → Add e inserisci:
- URL:
https://mcp.example.com - OAuth Client ID: il
client_iddel provider OAuth2 creato in Authentik - OAuth Client Secret: lascia vuoto (client pubblico con PKCE)
Claude aprirà il browser per il login su Authentik al primo utilizzo. Nessuna modifica manuale a file di configurazione.
Quando il test è ok:
- cambia upstream del Proxy Provider da
http://context9-mock:8080a URL reale Context9. - mantieni invariato il mapping che inietta
Authorizationda attributo utente. - valida scopes/permessi token lato Context9.