Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое SSO (Single Sign-On)?
Определение
SSO (Single Sign-On) — это механизм аутентификации, позволяющий пользователю войти один раз и получить доступ ко множеству связанных приложений и сервисов без повторной аутентификации. Он снижает количество паролей и упрощает пользовательский опыт.
Общая схема работы
Пользователь → SSO сервер (например, Okta, Azure AD, Keycloak)
↓
Проверка учётных данных
Выдача session token / JWT
↓
Пользователь получает доступ ко всем приложениям
Популярные протоколы SSO
1. OAuth 2.0
Назначение: Делегированная авторизация
1. Пользователь нажимает "Войти через Google"
2. Приложение перенаправляет на Google OAuth endpoint
3. Пользователь вводит данные на сервере Google
4. Google возвращает authorization code
5. Приложение обменивает код на access token
6. Приложение получает профиль пользователя
2. OpenID Connect (OIDC)
Назначение: Слой идентификации поверх OAuth 2.0
// Пример запроса к OIDC endpoint
GET /userinfo HTTP/1.1
Host: provider.example.com
Authorization: Bearer {access_token}
// Ответ содержит информацию о пользователе
{
"sub": "user123",
"email": "user@example.com",
"name": "John Doe"
}
3. SAML (Security Assertion Markup Language)
Назначение: Enterprise SSO (XML-based)
<saml:Assertion>
<saml:Subject>
<saml:NameID>user@example.com</saml:NameID>
</saml:Subject>
<saml:AuthenticationStatement>
<saml:AuthnContext>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContext>
</saml:AuthenticationStatement>
</saml:Assertion>
Архитектура на backend
Компоненты системы:
// 1. Identity Provider (IDP) — центральный сервер аутентификации
class IdentityProvider {
public:
Token authenticate(const Credentials& creds);
UserProfile getUserInfo(const Token& token);
bool validateToken(const Token& token);
};
// 2. Service Provider (SP) — приложение, которое делегирует аутентификацию
class ServiceProvider {
public:
Response handleLoginRequest(const HttpRequest& req);
Response handleCallback(const string& authorizationCode);
bool isAuthenticated(const HttpRequest& req);
};
// 3. Session Manager — управление сессиями
class SessionManager {
private:
std::unordered_map<string, Session> sessions_;
public:
string createSession(const UserProfile& profile);
Session* getSession(const string& sessionId);
void invalidateSession(const string& sessionId);
};
JWT токены в SSO
JWT (JSON Web Token) часто используется для распределённых систем:
// Структура JWT: Header.Payload.Signature
// Header: {"alg": "HS256", "typ": "JWT"}
// Payload: {"sub": "user123", "exp": 1234567890}
// Signature: HMACSHA256(header.payload, secret)
// Backend проверка JWT
bool validateJWT(const string& token, const string& secret) {
auto parts = split(token, ".");
if (parts.size() != 3) return false;
string signature = calculateSignature(parts[0], parts[1], secret);
return signature == decode(parts[2]);
}
Типичные вызовы в backend коде
// Проверка аутентификации перед запросом
bool handleGetUserProfile(const HttpRequest& req, HttpResponse& res) {
string sessionId = req.getCookie("session_id");
if (!sessionManager.isValid(sessionId)) {
res.setStatus(401);
return false;
}
UserProfile profile = sessionManager.getUser(sessionId);
res.setJson(profile.toJson());
return true;
}
// Обработка callback после аутентификации
bool handleOAuthCallback(const HttpRequest& req, HttpResponse& res) {
string code = req.getParam("code");
// Обменять код на token
Token token = idp.exchangeCodeForToken(code);
// Получить профиль пользователя
UserProfile profile = idp.getUserProfile(token.accessToken);
// Создать локальную сессию
string sessionId = sessionManager.createSession(profile);
// Установить cookie
res.setCookie("session_id", sessionId);
res.redirect("/dashboard");
return true;
}
Преимущества SSO
- Удобство: Один пароль для множества сервисов
- Безопасность: Пароль передаётся один раз централизованному провайдеру
- Управление: Администраторы контролируют доступ в одном месте
- Масштабируемость: Легко добавлять новые приложения
Вызовы и риски
- Single point of failure: Если IDP упадёт, все сервисы недоступны
- Token expiration: Нужна стратегия refresh tokens
- Cross-domain cookies: Ограничения браузеров на third-party cookies
- Race conditions: Синхронизация состояния между сервисами
Вывод
SSO — это фундаментальный паттерн современных распределённых систем. Backend-разработчик должен понимать как SAML/OAuth/OIDC работают на уровне протокола, так и как правильно интегрировать их в своё приложение с учётом безопасности и производительности.