OAuth 2.0 и OpenID Connect
↑ 5.5 Аутентификация и доступ: Keycloak, SSO, ACL · ← Предыдущая · → Следующая
Зачем это на собесе
Ждут: чем 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 + PKCE | SPA, мобильные, web-приложения (стандарт) |
| Client Credentials | сервис-сервис |
| Device Code | ТВ, CLI |
| Refresh Token | обновление |
| устарели, не используются |
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.
Практика
- Пройдите Authorization Code + PKCE вручную в Postman/curl и разберите токены.
- Настройте
oidc-client-tsилиkeycloak-jsдля SPA. - Найдите endpoint-ы в discovery-документе.
Вопросы с ответами
Чем OIDC отличается от OAuth 2.0?
OAuth даёт доступ к ресурсам, OIDC добавляет стандартную аутентификацию пользователя (
id_token).
Что такое PKCE?
Механизм защиты authorization code для публичных клиентов через одноразовую пару
code_verifier/code_challenge.