עזר להגדרת SSO
כל מה שניתן להגדיר בכניסה מאוחדת, במקום אחד. הערכים יושבים בשורות של
sso_connections ב־global.db (ברמת השרת במכוון), ונערכים דרך הגדרות →
שרת → כניסה מאוחדת או דרך פעולות ה־RPC של sso.*. השורה השמורה היא מקור
האמת היחיד — אין נתיב סביבה של CC_SAML_* / CC_OIDC_* (חיבור שיכול להגיע
משני מקומות הוא חיבור שמסך ההגדרות יכול לחלוק עליו).
שדות החיבור
קטע בשם “שדות החיבור”| שדה | חל על | ברירת מחדל | משמעות |
|---|---|---|---|
enabled |
שניהם | כבוי | כניסות רשאיות להשתמש בחיבור הזה |
idpMetadataXml |
SAML | — | ה־XML מסוג EntityDescriptor של ה־IdP (נדרש כדי להפעיל) |
spEntityId |
SAML | <origin>/saml |
מזהה הישות שלנו, ננעל כשהמקור משתנה |
emailAttribute |
SAML | email |
המאפיין שנושא את האימייל; NameID בצורת אימייל הוא חלופת ברירת המחדל |
displayNameAttribute |
SAML | displayName |
מאפיין שם התצוגה |
groupsAttribute |
SAML | groups |
מאפיין שמות הקבוצות |
clockSkewSeconds |
SAML | 90 | סובלנות סטיית שעון באימות תוקף |
allowIdpInitiated |
SAML | כבוי | קבלת תגובות לא מבוקשות (ללא InResponseTo) |
wantResponseSigned |
SAML | כבוי | דרישת חתימה על שורש התגובה (חתימות הצהרה נדרשות תמיד) |
issuer |
OIDC | — | כתובת הבסיס של ה־Issuer (נדרשת כדי להפעיל) |
clientId |
OIDC | — | מזהה לקוח ציבורי (נדרש כדי להפעיל) |
clientSecret |
OIDC | — | ללקוחות חסויים בלבד; נשמר בקובץ הסודות בהרשאות 0600, ולעולם לא במסד הנתונים — לכתיבה בלבד דרך RPC (sso.getConfig מדווח על clientSecretPresent) |
groupsClaim |
OIDC | groups |
ה־Claim שנושא את שמות הקבוצות |
defaultRole |
שניהם | member |
התפקיד כשאף קבוצה אינה ממופה — לעולם לא owner |
groupRoleMap |
שניהם | {} |
קבוצה → תפקיד; מיפויים ל־owner נדחים בשמירה |
autoMember |
שניהם | פועל | הוספה אוטומטית של משתמשים לכל סביבת עבודה בכניסה הראשונה |
allowJit |
שניהם | פועל | הקצאת משתמשים לא מוכרים בכניסה |
הגדרת התהליך
קטע בשם “הגדרת התהליך”חיבורי SSO אינם נזרעים מהסביבה. דגל תהליך אחד שנותר נוגע להעברה לדפדפן, ולא לשורת החיבור:
| משתנה / דגל | משמעות |
|---|---|
--web-client-url / CC_SERVER_WEB_CLIENT_URL |
המקור שאליו קריאות ה־callback של SSO מפנות את הדפדפן (פרטי הגישה עוברים בקטע ה־URL). כשזה לא מוגדר, ההעברה נשארת באותו מקור. |
כתובת ה־Issuer עצמה חייבת להיות https (http מתקבל רק עבור Issuer של
לולאה מקומית: localhost, 127.0.0.1 ו־::1).
נקודות קצה ב־HTTP
קטע בשם “נקודות קצה ב־HTTP”| נקודת קצה | אימות | מטרה |
|---|---|---|
GET /saml/login?relay=… |
ללא (הפניה מחדש) | התחלת כניסה ביוזמת ה־SP; relay=desktop מעביר לאפליקציה, relay=web-popup שולח postMessage ללשונית החיבור הממתינה (שמצהירה על ה־client_origin שלה, שמכובד רק כשרשימת המקורות המורשים נותנת בו אמון) |
POST /saml/acs |
ללא (POST מה־IdP) | צרכן ההצהרות — מאמת, מקצה ומנפיק |
GET /saml/metadata |
ללא | ה־EntityDescriptor של ה־SP שלנו |
GET /oidc/login?relay=… / GET /oidc/callback |
ללא | סבב ה־OIDC; relay=desktop מעביר לאפליקציה, relay=web-popup ללשונית החיבור הממתינה (אותה מוסכמת client_origin) |
GET /auth/providers |
ללא, CORS * |
בדיקת מסך החיבור: חיבורי ה־SSO המוצעים (id/kind/label) + pairingEnabled |
/scim/v2/Users… |
Bearer (אסימון SCIM) | Users: יצירה/שליפה/רשימה+סינון/PUT/PATCH/DELETE |
/scim/v2/Groups |
Bearer | לקריאה בלבד; דחיפת קבוצות מחזירה 501 במכוון |
/scim/v2/ServiceProviderConfig |
Bearer | מסמך יכולות |
פעולות RPC
קטע בשם “פעולות RPC”כל פעולות sso.* הן בהיקף השרת ומוגבלות לבעל השרת (המפעיל של ההתקנה,
ServerAuthority.serverOwner). בעלות על סביבת עבודה אינה מספיקה; צימוד לבדו
לעולם אינו מקנה אותן.
| פעולה | מטרה |
|---|---|
sso.getConfig |
החיבור השמור עבור סוג |
sso.saveConfig |
אימות, שמירה והחלה בזמן אמת |
sso.status |
דגלי הפעלה/הגדרה, נוכחות אסימון SCIM, המקור הקנוני |
sso.testConnection |
בדיקת חיבור בלי סבב הדפדפן (SAML: פענוח מטא־נתונים ובניית AuthnRequest; OIDC: גילוי ה־Issuer), עם ערכים אופציונליים שלא נשמרו מהמסך |
sso.spMetadata |
הפקת ה־EntityDescriptor של ה־SP עבור מקור |
sso.setPairingEnabled |
התרה/איסור של צימוד ידני (קודי הזמנה, מפתחות צימוד); סירוב לכבות אותו כשאין חיבור SSO עובד מגן מפני נעילה |
sso.sessionPolicy |
קריאת הגיל המרבי של פרטי הגישה במכשיר ופסק הזמן ללא פעילות (בדקות; 0 = לא מוגדר) |
sso.setSessionPolicy |
קביעת הגבולות האלה; נאכפים בבדיקת המכשיר, ואינם מדווחים ללקוחות |
sso.scimRegenerateToken |
יצירה והחזרה של אסימון ה־Bearer של SCIM (פעם אחת) |
קודי שגיאה באימות
קטע בשם “קודי שגיאה באימות”כשלים של cc_saml_verify_response נושאים קוד יציב:
| קוד | משמעות |
|---|---|
signature |
חתימה חסרה, לא מהימנה או שעבר שינוי, או אלגוריתם/טרנספורמציה אסורים |
expired |
מחוץ ל־NotBefore/NotOnOrAfter (מעבר לסטייה) |
audience |
הגבלת קהל היעד אינה מפרטת אותנו |
destination |
יעד התגובה אינו ה־ACS שלנו |
request_match |
ה־InResponseTo אינו תואם בקשה ממתינה, או תגובה לא מבוקשת כשזו אסורה |
issuer |
ה־Issuer אינו ה־IdP המוגדר |
recipient |
הנמען באישור הנושא אינו ה־ACS שלנו |
malformed |
כשל ברמת ה־XML/הסכימה |
status |
הסטטוס שדיווח ה־IdP אינו Success |
invalid / internal |
כל דבר אחר / כשל בתפר |
משטחי מסד הנתונים
קטע בשם “משטחי מסד הנתונים”sso_connections(global.db) — שורה אחת לכל סוג, חוצה סביבות עבודה במכוון.users.sso_subject+users.sso_issuer— נעיצת הנושא של הספק, ייחודית לכל(issuer, subject)באמצעות אינדקס חלקי.users.deactivated_at— חותמת ההשבתה של SCIM.- אסימון ה־Bearer של SCIM וסוד הלקוח של OIDC נמצאים בקובץ הסודות בהרשאות 0600, ולעולם לא במסד הנתונים.