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
/authespone 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-knownstandard.
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" | jqI 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.