OAuth2 и OpenID Connect для API
OAuth2 позволяет авторизованный доступ к API, а OpenID Connect добавляет стандартизированный способ аутентификации пользователей.
Краткое описание
OAuth2 — это широко распространённый фреймворк авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя без прямого получения пароля. OpenID Connect строится на основе OAuth2 и добавляет уровень идентификации через ID Token, подтверждающий аутентификацию пользователя. Вместе они составляют основу современного Single Sign-On и безопасности API. Ключевые концепции включают Authorization Server, Resource Server, Client, Access Token, ID Token, Scopes, Refresh Token и различные потоки, такие как Authorization Code Flow с PKCE. Правильная реализация критична для предотвращения кражи токенов, атак типа Man-in-the-Middle и несанкционированного доступа. OAuth2 и OpenID Connect сегодня используются практически во всех современных веб-, мобильных и облачных приложениях.
Основные компоненты
Authorization Server
Authorization Server — это центральная сущность, которая выдаёт токены. Он аутентифицирует пользователя, запрашивает согласие и выдаёт Access Token, а также опционально ID Token и Refresh Token. Известные Authorization Server включают Keycloak, Auth0, Okta и Azure AD.
Resource Server
Resource Server — это API, предоставляющий защищённые ресурсы. Он валидирует Access Token и на основе Scopes и Claims решает, разрешена ли запрашиваемая операция. Resource Server не знает пользователя напрямую, работая только с информацией в токене.
Client
Client — это приложение, которое хочет получить доступ к API от имени пользователя. Clients могут быть конфиденциальными, например backend-сервер, или публичными, как мобильное приложение или Single-Page-Application. Публичные clients требуют дополнительных защитных мер, таких как PKCE.
Access Token
Access Token — это недолгоживущий токен, предоставляющий client доступ к защищённым ресурсам. Он передаётся в заголовке Authorization как Bearer Token. Access Tokens должны быть действительны не дольше, чем необходимо, и всегда передаваться по HTTPS.
ID Token
ID Token выдаётся OpenID Connect и содержит информацию об идентичности пользователя, такую как Sub, Name и Email. Это JWT, используемый для аутентификации, а не для доступа к API. Доступ к API осуществляется с помощью Access Token.
Refresh Token
Refresh Tokens — это долгоживущие токены, позволяющие client запросить новый Access Token без повторного запроса пароля пользователя. Они должны быть надёжно защищены и подлежат отзыву при подозрении на компрометацию.
Scopes
Scopes определяют, какие разрешения запрашивает client. Примеры включают read, write или profile. Authorization Server решает, какие scopes будут предоставлены. Resource Server затем проверяет, падает ли запрашиваемое действие в рамки scope токена.
Authorization Code Flow
Authorization Code Flow — это наиболее безопасный и распространённый OAuth2 поток. Пользователь перенаправляется на Authorization Server, входит в систему, а сервер отправляет код обратно клиентскому приложению. Client обменивает код на Access Token и ID Token.
PKCE
PKCE расшифровывается как Proof Key for Code Exchange и является расширением Authorization Code Flow. Он защищает публичные clients, такие как мобильные приложения или Single-Page-Applications, от атак перехвата кода. Client генерирует случайный Code Verifier и отправляет его хеш как Code Challenge.
Client Credentials Flow
Client Credentials Flow используется для машин-к-машинному взаимодействию, когда пользователь не задействован. Client аутентифицируется напрямую у Authorization Server с помощью Client ID и Client Secret и получает Access Token.
Implicit Flow и Password Flow
Implicit Flow и Resource Owner Password Credentials Flow считаются устаревшими и больше не должны использоваться, так как несут в себе риски безопасности. Современные приложения вместо этого используют Authorization Code Flow с PKCE.
Валидация токенов
Resource Server должен валидировать Access Token перед обработкой запроса. Для этого он проверяет подпись, время истечения, издателя, audience и scopes. Самоподписанные JWTs проверяются с использованием публичного ключа Authorization Server, непрозрачные токены — через Introspection.
Logout и управление сеансом
OpenID Connect определяет различные механизмы logout, включая RP-Initiated Logout, Back-Channel Logout и Front-Channel Logout. Они позволяют централизованно завершать сеансы и инвалидировать токены.
Практический пример
Мобильное приложение хочет получить доступ к API профиля пользователя. Оно использует Authorization Code Flow с PKCE.
Шаг 1: Приложение генерирует Code Verifier и Code Challenge:
code_verifier = random_string(128)
code_challenge = BASE64URL(SHA256(code_verifier))
Шаг 2: Приложение перенаправляет пользователя на Authorization Server:
https://auth.example.com/authorize?
response_type=code
&client_id=mobile-app
&redirect_uri=app://callback
&scope=openid profile read:profile
&code_challenge=abc123
&code_challenge_method=S256
&state=xyz789
Шаг 3: После успешной аутентификации и согласия приложение получает Authorization Code:
app://callback?code=AUTH_CODE&state=xyz789
Шаг 4: Приложение обменивает код на токены:
POST /token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=AUTH_CODE
&redirect_uri=app://callback
&client_id=mobile-app
&code_verifier=CODE_VERIFIER
Шаг 5: Приложение вызывает API:
GET /api/v1/profile
Authorization: Bearer ACCESS_TOKEN
PKCE делает поток безопасным даже для публичных clients, потому что перехваченный код не может быть обменян без Code Verifier.
FAQ: OAuth2 и OpenID Connect
1. Что такое OAuth2?
2. Что такое OpenID Connect?
3. Что такое разница между Access Token и ID Token?
4. Что такое PKCE?
5. Что такое Scopes?
6. Что такое Refresh Token?
7. Что такое Authorization Code Flow?
8. Что такое Client Credentials Flow?
9. Почему Implicit и Password Flow считаются устаревшими?
10. Что такое Token Introspection?
11. Что такое Audience Claim?
12. Как валидируется JWT Access Token?
13. Что такое Single Sign-On?
14. Что такое Back-Channel Logout?
15. Какие типичные ошибки допускают при OAuth2?
Продолжение в пути изучения API
Следующая статья в пути изучения API посвящена JWT Token: структура, безопасность и правильное использование — устройству JSON Web Tokens, схемам подписи и лучшим практикам безопасности.
Источники
- https://datatracker.ietf.org/doc/html/rfc6749
- https://openid.net/specs/openid-connect-core-1_0.html
- https://datatracker.ietf.org/doc/html/rfc7636
Рекомендуемые книги по безопасности API
Если хочешь углубиться в OAuth2, OpenID Connect и безопасность API, рекомендуем следующие книги:
Keine Bücher für Kategorie "security" gefunden.



