Vai al contenuto

Cerca nella documentazione

Digita per cercare in tutte le pagine della documentazione.

Menu della documentazione
ProceduraPubblico · Operatori e sviluppatori

Autenticazione con Keycloak

Autenticazione OIDC per la REST API e il server MCP

Questa pagina è stata tradotta automaticamente dall'inglese. In caso di differenze, fa fede l'originale.Leggi l'originale in inglese

Come Agent-Lab usa Keycloak

Keycloak gestisce autenticazione e autorizzazione tramite OpenID Connect. Quando auth.enabled è true (vedi il Riferimento della configurazione):

  • il middleware FastAPI convalida i bearer token rispetto al JWKS del realm a ogni richiesta, con le esclusioni standard (/auth/*, /status/*, /docs, /openapi.json, /mcp, /static);
  • il router /auth espone login, rinnovo, profilo e un endpoint di scambio per Microsoft Entra ID;
  • il server MCP autentica i client tramite un proxy OAuth basato sullo stesso realm, pubblicando gli endpoint di metadati .well-known standard.

Configurare realm, client e service account

I passaggi seguenti utilizzano la Keycloak Admin API. Per prima cosa, imposta le credenziali di amministratore e l'endpoint:

export ADMIN_USER=<admin_username>
export ADMIN_PASS=<admin_password>
export ADMIN_TOKEN=$(curl -s -X POST "https://<auth_fqdn>/realms/master/protocol/openid-connect/token" \
    -d "username=${ADMIN_USER}&password=${ADMIN_PASS}&grant_type=password&client_id=admin-cli" | jq -r '.access_token')

Crea un realm (sostituisci <realm_name>):

curl -X POST https://<auth_fqdn>/admin/realms \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ${ADMIN_TOKEN}" \
  -d '{"realm": "<realm_name>", "enabled": true}'

Crea un client per Agent-Lab:

curl -X POST https://<auth_fqdn>/admin/realms/<realm_name>/clients \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ${ADMIN_TOKEN}" \
  -d '{
    "clientId": "<client_name>",
    "enabled": true,
    "protocol": "openid-connect",
    "publicClient": false,
    "redirectUris": ["https://<agent_lab_fqdn>/*"],
    "standardFlowEnabled": true,
    "clientAuthenticatorType": "client-secret"
  }'

Ottieni il client secret:

export CLIENT_ID=$(curl -X GET "https://<auth_fqdn>/admin/realms/<realm_name>/clients?clientId=<client_name>" \
  -H "Authorization: Bearer ${ADMIN_TOKEN}" | jq -r '.[0].id')

export CLIENT_SECRET=$(curl -X GET "https://<auth_fqdn>/admin/realms/<realm_name>/clients/${CLIENT_ID}/client-secret" \
  -H "Authorization: Bearer ${ADMIN_TOKEN}" | jq -r '.value')

Questi valori corrispondono alle chiavi di configurazione auth.* (auth.url, auth.realm, auth.client_id, auth.client_secret): archiviali nel payload di Vault come indicato nel Riferimento della configurazione.

Crea un utente service account:

curl -X POST https://<auth_fqdn>/admin/realms/<realm_name>/users \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ${ADMIN_TOKEN}" \
  -d '{
    "username": "<username>",
    "enabled": true,
    "email": "<username>@example.com",
    "credentials": [{"type": "password", "value": "<user_password>", "temporary": false}]
  }'

Se necessario, perfeziona ruoli e mapper nell'interfaccia di Keycloak.

Emettere e verificare i token

Ottieni un token utente (password grant, lo stesso flusso che POST /auth/login esegue lato app):

export USER_TOKEN=$(curl -s -X POST https://<auth_fqdn>/realms/<realm_name>/protocol/openid-connect/token \
  -d "grant_type=password" \
  -d "client_id=<client_name>" \
  -d "client_secret=${CLIENT_SECRET}" \
  -d "username=<username>" \
  -d "password=<user_password>" | jq -r '.access_token')

curl -s https://<agent_lab_fqdn>/agents/list -H "Authorization: Bearer $USER_TOKEN" | jq

I token si rinnovano tramite POST /auth/renew, e gli utenti autenticati in Microsoft Entra ID possono scambiare le proprie credenziali con token dell'app tramite POST /auth/exchange (flusso authorization code con PKCE, basato sulle credenziali Entra ID presenti nella configurazione).

Provisioning automatizzato

Il modulo Terraform terraform/12_agent-lab-auth-realm/ (parte della guida al deployment) effettua il provisioning di realm, client e service account per il deployment di riferimento: usalo negli ambienti reali al posto dei passaggi manuali.