OAuth 2.0 и OpenID Connect

↑ 5.5 Аутентификация и доступ: Keycloak, SSO, ACL · ← Предыдущая · → Следующая

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

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

Ждут: чем OAuth отличается от OIDC и почему для SPA нужен Authorization Code + PKCE.

Объяснение

OAuth 2.0 — протокол делегирования доступа: приложение получает токен на ограниченный доступ к ресурсам от имени пользователя. OpenID Connect (OIDC) — слой аутентификации поверх OAuth: добавляет id_token и userinfo.

Роли: пользователь (Resource Owner), приложение (Client), Authorization Server (Keycloak и др.), Resource Server (API).

FlowКогда
Authorization Code + PKCESPA, мобильные, web-приложения (стандарт)
Client Credentialsсервис-сервис
Device CodeТВ, CLI
Refresh Tokenобновление
Implicit, Passwordустарели, не используются

PKCE защищает authorization code от перехвата у публичных клиентов (без client secret): клиент генерирует code_verifier, отправляет code_challenge = SHA256(verifier), а при обмене кода предъявляет verifier.

// Упрощённо (вручную; в реальности — библиотека oidc-client-ts / keycloak-js)
const verifier = base64url(crypto.getRandomValues(new Uint8Array(32)));
const challenge = base64url(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier)));
sessionStorage.setItem("pkce_verifier", verifier);
location.href = `${issuer}/authorize?response_type=code&client_id=spa&redirect_uri=${cb}&scope=openid profile email&state=${state}&nonce=${nonce}&code_challenge=${challenge}&code_challenge_method=S256`;
// на /callback: проверить state → POST /token {grant_type: authorization_code, code, code_verifier, redirect_uri}

Параметры: scope (права доступа: openid, profile, email, свои), state (защита от CSRF при редиректе), nonce (защита от replay id_token), redirect_uri (строгое совпадение).

Токены: id_token (для клиента, содержит личность), access_token (для API), refresh_token. Endpoint-ы: /.well-known/openid-configuration (discovery), /authorize, /token, /userinfo, /logout, /certs (JWKS).

Библиотеки: oidc-client-ts, keycloak-js, @auth0/auth0-vue, vue-oidc-client.

Нюансы и подводные камни

  • Проверяйте state и nonce.
  • Строгие redirect_uri без wildcard.
  • Client secret не хранят в SPA: публичный клиент + PKCE.
  • Не смешивайте id_token и access_token: API принимает access token.
  • Silent renew через iframe ломается третьесторонними cookie: используйте refresh token rotation.

Практика

  1. Пройдите Authorization Code + PKCE вручную в Postman/curl и разберите токены.
  2. Настройте oidc-client-ts или keycloak-js для SPA.
  3. Найдите endpoint-ы в discovery-документе.

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

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