OAuth 2.0, OpenID Connect и Keycloak на бэкенде

↑ 3.4 Аутентификация и авторизация · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

«Чем OAuth отличается от OIDC и какой flow вы используете» — стандартный вопрос.

Объяснение

  • OAuth 2.0 — протокол авторизации: приложение получает токен доступа к ресурсам от имени пользователя.
  • OpenID Connect (OIDC) — слой аутентификации поверх OAuth: добавляет id_token и userinfo.
РольКто
Resource Ownerпользователь
Clientприложение
Authorization ServerKeycloak, Auth0, Entra ID
Resource Serverваш API
FlowКогда
Authorization Code + PKCESPA, мобильные и веб-приложения (рекомендуется)
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.

Практика

  1. Поднимите Keycloak в Docker и настройте realm, client, роли.
  2. Защитите API и получите токен через Authorization Code + PKCE.
  3. Реализуйте service-to-service вызов через Client Credentials.

Вопросы с ответами

Связанные темы