איך Agent-Lab משתמש ב-Keycloak
Keycloak מנהל אימות והרשאות באמצעות OpenID Connect.
כאשר auth.enabled הוא true (ראו את חומר העזר לתצורה):
- ה-middleware של FastAPI מאמת bearer tokens מול ה-JWKS של ה-realm בכל בקשה, עם
ההחרגות הסטנדרטיות (
/auth/*,/status/*,/docs,/openapi.json,/mcp,/static); - ה-router של
/authחושף התחברות, חידוש, פרופיל ונקודת קצה להחלפת טוקנים של Microsoft Entra ID; - שרת ה-MCP מאמת לקוחות דרך OAuth proxy המגובה באותו realm, ומפרסם את
נקודות הקצה הסטנדרטיות של מטא-נתוני
.well-known.
הגדרת realm, לקוח וחשבון שירות
השלבים שלהלן משתמשים ב-Keycloak Admin API. קודם מגדירים את פרטי ההתחברות של המנהל ואת נקודת הקצה:
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')יצירת realm (מחליפים את <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}'יצירת לקוח עבור 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"
}'קבלת סוד הלקוח:
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')ערכים אלה ממופים למפתחות התצורה auth.* (auth.url, auth.realm,
auth.client_id, auth.client_secret) — שומרים אותם במטען של Vault בהתאם
לחומר העזר לתצורה.
יצירת משתמש לחשבון שירות:
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}]
}'במידת הצורך, מכווננים תפקידים ו-mappers בממשק המשתמש של Keycloak.
הנפקה ואימות של טוקנים
קבלת טוקן משתמש (password grant — אותו תהליך ש-POST /auth/login מבצע בצד
האפליקציה):
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טוקנים מתחדשים דרך POST /auth/renew, ואת המשתמשים שאומתו ב-Microsoft Entra ID אפשר
להחליף בטוקנים של האפליקציה דרך POST /auth/exchange (תהליך authorization-code עם
PKCE, המגובה בפרטי ההתחברות של Entra ID שבתצורה).
הקצאה אוטומטית
מודול ה-Terraform terraform/12_agent-lab-auth-realm/ (חלק ממדריך הפריסה)
מקצה את ה-realm, הלקוח וחשבון השירות עבור פריסת הדוגמה — בסביבות אמיתיות כדאי להשתמש
בו במקום בשלבים הידניים.