Інтеграція Keycloak для аутентифікації на веб-сайті
Keycloak — open-source Identity and Access Management від Red Hat. Self-hosted аналог Auth0/Okta, підтримує OpenID Connect, OAuth 2.0, SAML 2.0. Розгортається на власній інфраструктурі — дані користувачів не покидають периметр.
Коли обирають Keycloak
- Вимога зберігати дані на власній інфраструктурі
- Потреба в SSO для кількох внутрішніх додатків
- Enterprise: інтеграція з Active Directory/LDAP
- Compliance: GDPR, вимоги регуляторів до локалізації даних
- Немає бюджету на підписку IDaaS
Розгортання
Розгорнути Keycloak за допомогою Docker або Kubernetes. Потрібна PostgreSQL або MySQL backend.
Налаштування Realm та Client
- Створити Realm (логічно ізольована область аутентифікації)
- Створити Client для веб-додатку:
- Client type: OpenID Connect
- Client authentication: On (confidential)
- Valid redirect URIs: (callback URL вашого додатку)
- Valid post logout redirect URIs: (logout URL вашого додатку)
- Зберегти Client ID та Client Secret (вкладка Credentials)
Laravel інтеграція через Socialite
Використовувати Laravel Socialite з кастомною конфігурацією провайдера. Налаштувати OAuth callback для обміну коду на токени та створення сесії.
Пряма верифікація JWT (для API)
Keycloak публікує JWKS за стандартною URL. API може перевіряти JWT напрямку без звернення до Keycloak:
// Node.js приклад
import jwt from 'jsonwebtoken';
import jwksClient from 'jwks-rsa';
const client = jwksClient({
jwksUri: 'https://keycloak.example.com/auth/realms/myrealm/.well-known/openid-configuration'
});
async function verifyToken(token: string) {
const decoded = jwt.decode(token, { complete: true });
const key = await client.getSigningKey(decoded.header.kid);
return jwt.verify(token, key.getPublicKey(), {
algorithms: ['RS256'],
issuer: 'https://keycloak.example.com/auth/realms/myrealm'
});
}
LDAP / Active Directory інтеграція
У Keycloak Admin Console:
- User Federation → Add provider → LDAP
- Вказати Connection URL, Bind DN, Users DN
- Налаштувати маппинг атрибутів: CN → username, mail → email
Після налаштування співробітники входять з корпоративними логінами напрямку через Keycloak.
Logout
Keycloak підтримує front-channel та back-channel logout (RP-Initiated Logout):
GET /auth/realms/{realm}/protocol/openid-connect/logout?redirect_uri={url}&post_logout_redirect_uri={url}
Тимчасовість робіт
| Етап | Час |
|---|---|
| Розгортання Keycloak (Docker + PostgreSQL) | 1 день |
| Налаштування Realm, Client, ролей | 0,5 дня |
| Laravel інтеграція + callback | 1,5 дня |
| JWT middleware для API | 1 день |
| LDAP/AD інтеграція (якщо потрібна) | 1–2 дні |
| Тести | 1 день |
Всього: 5–7 робочих днів.







