אנו מפתחים פתרונות SSO עבור יישומי אינטרנט — החל מאינטגרציה עם Google Workspace ועד לפריסת ספק זהויות מותאם אישית על Keycloak עם ריבוי דיירים (multi-tenancy). במשך יותר מ-5 שנים, השלמנו יותר מ-50 פרויקטים ומבטיחים אימות תקין של טוקנים, פעולת SLO תקינה, והיעדר תנאי מרוץ (race conditions) בתרחישי משתמשים מרובים. SSO מתוכנן בצורה גרועה הוא נקודת כשל יחידה: אם ה-IdP אינו זמין, משתמשים לא יכולים להיכנס לאף יישום. כאשר הוא מיושם נכון, חיסכון בעלויות תמיכה יכול להגיע ל-$50,000 בשנה.
למה ליישם SSO?
SSO מפחית את מספר הסיסמאות שעובד צריך לזכור — עד 40% מהבקשות לאיפוס סיסמה נעלמות. עבור עסקים, זה חוסך זמן ומפשט את תהליך הקליטה: עובד חדש מקבל מיד גישה לכל המערכות דרך חשבון יחיד. מבחינה אבטחתית, ניהול גישה מרכזי מפשט את הביקורת ואת חסימת החשבון כאשר עובד עוזב. לפי סטטיסטיקות, חברות חוסכות עד 30% מתקציבי תמיכת ה-IT.
פרוטוקולים והתאמתם
שני תקנים עדכניים: SAML 2.0 ו-OpenID Connect (OIDC). ההשוואה ביניהם מופיעה בטבלה.
| מאפיין | SAML 2.0 | OpenID Connect |
|---|---|---|
| פורמט נתונים | XML | JSON |
| תעבורה | HTTP POST / Redirect / Artifact | HTTPS (REST) |
| תחום יישום | IdP ארגוני (Azure AD, Okta) | יישומי אינטרנט, מובייל, SPA |
| מורכבות יישום | גבוהה (XML מסורבל) | בינונית (אינטגרציה קלה) |
עבור פרויקטים חדשים, הבחירה היא כמעט תמיד OIDC. היוצא מן הכלל הוא אינטגרציה עם IdP ארגוניים מדור קודם שתומכים רק ב-SAML. במקרה כזה, ניתן למקם מתווך (broker) כמו Keycloak או Dex בחזית, שמקבל SAML ומעביר OIDC. OIDC מהיר פי 2 להגדרה ודורש כ-40% פחות קוד מאשר SAML — זה אומת ביותר מ-50 פרויקטים.
זרימת Authorization Code בסיסית עם PKCE:
Browser → /authorize?response_type=code&code_challenge=... → IdP
IdP → callback?code=AUTH_CODE → App
App → POST /token (code + code_verifier) → IdP
IdP → { access_token, id_token, refresh_token }
App → validate id_token signature → create sessionPKCE הוא חובה עבור לקוחות ציבוריים (SPA, מובייל) — הוא מגן מפני יירוט קוד ההרשאה. לפי מפרט OpenID Connect, PKCE מונע התקפות יירוט קוד.
איך אנו משלבים SSO תוך 3–5 ימים?
המתודולוגיה שלנו כוללת 6 שלבים:
- ניתוח הארכיטקטורה הנוכחית של האימות ומודל הסשן.
- תכנון: בחירת פרוטוקול, הגדרת IdP, הגדרת scopes ו-claims.
- הגדרת ספק זהויות (Keycloak, Azure AD) או אינטגרציה עם ספק קיים.
- פיתוח מודול אימות: יישום callback, אימות טוקן, ניהול סשן.
- יישום Single Logout (SLO) וטיפול במקרי קצה.
- בדיקות: יחידה, אינטגרציה, עומס (עד 1000 משתמשים במקביל).
בואו נצלול לדוגמה של אינטגרציית OIDC עם Azure AD.
אימות טוקן הוא שלב קריטי. ה-id_token הוא JWT. אנו מבטיחים אימות נכון של חתימה, תפוגה, קהל (audience) ומנפיק (issuer). דוגמה ב-Python:
from jwt import PyJWT, algorithms
import requests
def validate_id_token(token: str, client_id: str, issuer: str) -> dict:
jwks_uri = f"{issuer}/.well-known/openid-configuration"
config = requests.get(jwks_uri).json()
jwks = requests.get(config["jwks_uri"]).json()
header = PyJWT.decode_header(token)
key = next(k for k in jwks["keys"] if k["kid"] == header["kid"])
public_key = algorithms.RSAAlgorithm.from_jwk(key)
claims = PyJWT.decode(
token,
public_key,
algorithms=["RS256"],
audience=client_id,
issuer=issuer,
options={"verify_exp": True}
)
return claims
מפתחות IdP נשמרים במטמון עם TTL של 1–6 שעות, עם אפשרות לפסילה בעת סיבוב מפתחות. אינטגרציה ביישום Laravel משתמשת ב-Browser → /authorize?response_type=code&code_challenge=... → IdP IdP → callback?code=AUTH_CODE → App App → POST /token (code + code_verifier) → IdP IdP → { access_token, id_token, refresh_token } App → validate id_token signature → create session או from jwt import PyJWT, algorithms import requests def validate_id_token(token: str, client_id: str, issuer: str) -> dict: jwks_uri = f"{issuer}/.well-known/openid-configuration" config = requests.get(jwks_uri).json() jwks = requests.get(config["jwks_uri"]).json() header = PyJWT.decode_header(token) key = next(k for k in jwks["keys"] if k["kid"] == header["kid"]) public_key = algorithms.RSAAlgorithm.from_jwk(key) claims = PyJWT.decode( token, public_key, algorithms=["RS256"], audience=client_id, issuer=issuer, options={"verify_exp": True} ) return claims . דוגמת callback:
// SsoController.php
public function callback(Request $request): RedirectResponse
{
$tokens = $this->oidcClient->exchangeCode($request->input('code'));
$claims = $this->oidcClient->validateIdToken($tokens['id_token']);
$user = User::updateOrCreate(
['sub' => $claims['sub']],
[
'email' => $claims['email'],
'name' => $claims['name'],
'provider' => 'corporate_sso',
'last_login' => now(),
]
);
Auth::login($user, remember: true);
return redirect()->intended('/dashboard');
}השדה league/oauth2-client הוא מזהה יציב; תמיד קשר לפי זה, לא לפי אימייל. Single Logout (SLO) מיושם דרך backchannel: טפל ב-socialite ומחק סשנים לפי // SsoController.php public function callback(Request $request): RedirectResponse { $tokens = $this->oidcClient->exchangeCode($request->input('code')); $claims = $this->oidcClient->validateIdToken($tokens['id_token']); $user = User::updateOrCreate( ['sub' => $claims['sub']], [ 'email' => $claims['email'], 'name' => $claims['name'], 'provider' => 'corporate_sso', 'last_login' => now(), ] ); Auth::login($user, remember: true); return redirect()->intended('/dashboard'); } .
Route::post('/auth/backchannel-logout', function (Request $request) {
$logoutToken = $request->input('logout_token');
$claims = validateLogoutToken($logoutToken);
DB::table('sessions')->where('sso_session_id', $claims['sid'])->delete();
return response()->noContent();
})->middleware('throttle:60,1'); טעויות נפוצות ביישום SSO
| טעות | השלכות | פתרון |
|---|---|---|
| אימות טוקן שגוי | קבלת טוקנים מזויפים | אמת חתימה, aud, exp |
| התעלמות מ-PKCE | יירוט קוד הרשאה | חובה עבור SPA ומובייל |
| חוסר SLO | סשנים פתוחים לאחר התנתקות | יישם backchannel logout |
| קישור קשיח לאימייל | בעיות בעת שינוי אימייל | קשר לפי sub |
טיפול בשגיאות ומקרי קצה
- IdP לא זמין: גיבוי לכניסה מקומית עם הודעה על אי-זמינות זמנית של SSO.
- תפוגת סשן IdP במהלך עבודה פעילה: רענון שקוף דרך refresh_token.
- שינוי אימייל: עדכון לפי
sub, ללא כפילויות. - ריבוי דיירים: קביעת IdP לפי דומיין אימייל או tenant_id ב-URL.
מה כלול בעבודה
- ניתוח מערכת האימות הנוכחית ומודל הסשן.
- תכנון ארכיטקטורת SSO (IdP, לקוחות, פרוטוקול).
- הגדרת ספק זהויות (Keycloak, Azure AD) או אינטגרציה עם ספק קיים.
- פיתוח מודולי אימות, אימות טוקן, SLO.
- תיעוד תפעול והגדרות.
- הדרכת מנהלים (ניהול חשבונות, סיבוב מפתחות).
- אחריות ל-30 יום על הפונקציונליות.
לוחות זמנים וקביעת עלות
- אינטגרציה עם ספק OIDC יחיד (Google Workspace, Azure AD) — 3–5 ימים.
- IdP Keycloak מותאם אישית עם יישומים מרובים — 2–3 שבועות.
- מתווך SAML + OIDC עם ריבוי דיירים — החל מ-4 שבועות.
העלות בפועל נקבעת לאחר ניתוח הארכיטקטורה והדרישות הספציפיות שלך. עיקר הזמן מושקע בהגדרת IdP, בדיקות מקרי קצה והגדרת SLO. צור קשר כדי לקבל הערכת פרויקט חינמית ופתרון מותאם. קבל ייעוץ על אינטגרציית SSO עוד היום.







