Skip to content

gridsociety/authentik-context9

Repository files navigation

Authentik + Cloudflare Tunnel (Docker Compose)

Stack di test per validare questo flusso:

  1. Claude Desktop fa OAuth2 verso Authentik.
  2. Authentik riceve la richiesta verso un Proxy Provider.
  3. Un Proxy Property Mapping legge un attributo utente (context9_token).
  4. Authentik inietta Authorization: Bearer <token> verso backend MCP (qui mockato con context9-mock).

1) Prerequisiti

  • 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).

2) Bootstrap rapido

cp .env.example .env
# modifica .env con valori reali

docker compose up -d

Authenik sarà disponibile internamente su:

  • http://localhost:9000
  • https://localhost:9443

L'accesso pubblico deve avvenire tramite AUTHENTIK_HOST_BROWSER (es. https://auth.example.com).

3) Primo login admin

docker compose exec authentik-server ak create_admin_group
docker compose exec authentik-server ak create_user --username admin

Poi apri AUTHENTIK_HOST_BROWSER e completa setup/login.

4) Configurazione Authentik per il test

4.1 OAuth2 Provider (per Claude Desktop)

In Authentik:

  • Crea un Application chiamato claude-desktop-mcp.
  • Crea un Provider di tipo OAuth2/OpenID con:
    • Client type: Public
    • Authorization flow: con PKCE abilitato
    • Redirect URI: quello usato da Claude Desktop (in base alla versione)
  • Collega provider e application.

Annota:

  • client_id
  • authorization_endpoint (tipicamente https://auth.example.com/application/o/authorize/)
  • token_endpoint (tipicamente https://auth.example.com/application/o/token/)

4.2 Proxy Provider (reverse proxy verso backend MCP)

  • Crea un Provider di tipo Proxy con upstream http://context9-mock:8080.
  • Associa un FQDN dedicato (es. mcp.example.com) tramite Cloudflare Tunnel.
  • Crea un'Application per il proxy.

4.3 Attributo utente + Header injection

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.

5) Verifica funzionale

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 ....

6) Aggiungere il connector in Claude Desktop

Apri Settings → Connectors → Add e inserisci:

  • URL: https://mcp.example.com
  • OAuth Client ID: il client_id del 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.

7) Passaggio a Context9 reale

Quando il test è ok:

  • cambia upstream del Proxy Provider da http://context9-mock:8080 a URL reale Context9.
  • mantieni invariato il mapping che inietta Authorization da attributo utente.
  • valida scopes/permessi token lato Context9.

About

Authentik + Cloudflare Tunnel + OpenResty proxy for Context9 MCP server with per-user token injection

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors