OAuth 2.0, OpenID Connect и Keycloak на бэкенде
↑ 3.4 Аутентификация и авторизация · ← Предыдущая · → Следующая
Зачем это на собесе
«Чем OAuth отличается от OIDC и какой flow вы используете» — стандартный вопрос.
Объяснение
- OAuth 2.0 — протокол авторизации: приложение получает токен доступа к ресурсам от имени пользователя.
- OpenID Connect (OIDC) — слой аутентификации поверх OAuth: добавляет
id_tokenиuserinfo.
| Роль | Кто |
|---|---|
| Resource Owner | пользователь |
| Client | приложение |
| Authorization Server | Keycloak, Auth0, Entra ID |
| Resource Server | ваш API |
| Flow | Когда |
|---|---|
| Authorization Code + PKCE | SPA, мобильные и веб-приложения (рекомендуется) |
| Client Credentials | сервис-сервис без пользователя |
| Device Code | ТВ, CLI |
| Refresh Token | обновление access |
| Implicit, Password | устарели, не использовать |
sequenceDiagram participant U as Пользователь participant C as SPA participant K as Keycloak participant A as API U->>C: Войти C->>K: /authorize + code_challenge (PKCE) K->>U: форма логина K->>C: authorization code C->>K: /token + code_verifier K->>C: access + id + refresh C->>A: Authorization: Bearer access
API как Resource Server
builder.Services.AddAuthentication().AddJwtBearer(o =>
{
o.Authority = builder.Configuration["Keycloak:Authority"];
o.Audience = "orders-api";
});Роли из Keycloak лежат в realm_access.roles/resource_access — их нужно замапить в claims (OnTokenValidated или IClaimsTransformation).
Нюансы и подводные камни
- PKCE защищает публичных клиентов от перехвата code.
- Client secret нельзя хранить в SPA.
- Проверяйте
aud: токен для другого API не должен приниматься. - Scope — что клиенту разрешено; claims — данные о пользователе.
- Настраивайте redirect URI строго, без wildcard.
Практика
- Поднимите Keycloak в Docker и настройте realm, client, роли.
- Защитите API и получите токен через Authorization Code + PKCE.
- Реализуйте service-to-service вызов через Client Credentials.
Вопросы с ответами
Чем OIDC отличается от OAuth 2.0?
OAuth даёт доступ к ресурсам; OIDC добавляет стандартную аутентификацию пользователя (
id_token).
Зачем PKCE?
Защищает authorization code от перехвата у публичных клиентов, заменяя client secret проверкой
code_verifier.
Какой flow для сервис-сервис?
Client Credentials.