Skip to content
IRC-CodingIRC-Coding
OAuth2OpenID ConnectOIDCAccess TokenID TokenPKCE

OAuth2 и OpenID Connect для APIs: безопасный доступ

OAuth2 и OpenID Connect: Flows, Access Tokens, ID Tokens, Scopes, PKCE и best practices для API-аутентификации.

S

schutzgeist

5 min read
OAuth2 и OpenID Connect для APIs: безопасный доступ

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?

OAuth2 — это фреймворк авторизации, позволяющий приложениям получать доступ к ресурсам от имени пользователя без знания пароля пользователя.

2. Что такое OpenID Connect?

OpenID Connect — это уровень идентификации, построенный на основе OAuth2. Он позволяет аутентифицировать пользователя и предоставляет ID Token с информацией об идентичности.

3. Что такое разница между Access Token и ID Token?

Access Token используется для доступа к защищённым API. ID Token служит для аутентификации и содержит информацию об идентичности пользователя.

4. Что такое PKCE?

PKCE расшифровывается как Proof Key for Code Exchange. Это расширение Authorization Code Flow, защищающее публичные clients, такие как мобильные приложения и Single-Page-Applications, от атак перехвата кода.

5. Что такое Scopes?

Scopes определяют разрешения, которые запрашивает client. Они указываются у Authorization Server и фиксируются в Access Token. Resource Server проверяет их перед предоставлением доступа.

6. Что такое Refresh Token?

Refresh Token — это долгоживущий токен, позволяющий client запросить новый Access Token без повторной аутентификации пользователя. Refresh Tokens должны быть надёжно защищены.

7. Что такое Authorization Code Flow?

Authorization Code Flow — это наиболее распространённый и безопасный OAuth2 поток. Client получает код после аутентификации пользователя и обменивает его в backend на токены.

8. Что такое Client Credentials Flow?

Client Credentials Flow используется для машин-к-машинного взаимодействия. Client аутентифицируется напрямую с помощью Client ID и Client Secret и получает Access Token.

9. Почему Implicit и Password Flow считаются устаревшими?

Implicit и Password Flow сопряжены с рисками безопасности, такими как экспонирование токенов в браузере или передача паролей третьим лицам. Современные приложения используют Authorization Code Flow с PKCE.

10. Что такое Token Introspection?

Token Introspection — это эндпоинт Authorization Server, позволяющий Resource Server проверить непрозрачный токен. Сервер получает информацию о валидности, времени истечения и scopes.

11. Что такое Audience Claim?

Audience Claim в токене указывает, для какого API или сервиса предназначен токен. Resource Server проверяет, является ли он целевой audience, чтобы предотвратить злоупотребление токеном.

12. Как валидируется JWT Access Token?

JWT Access Token проверяется на подпись, издателя, audience, время истечения и scopes. Подпись верифицируется с использованием публичного ключа Authorization Server.

13. Что такое Single Sign-On?

Single Sign-On позволяет пользователям входить один раз и получать доступ к нескольким приложениям без повторной аутентификации. OpenID Connect — распространённый протокол для этого.

14. Что такое Back-Channel Logout?

Back-Channel Logout — это механизм OpenID Connect, при котором Authorization Server напрямую уведомляет приложения посредством серверного вызова о завершении сеанса.

15. Какие типичные ошибки допускают при OAuth2?

Типичные ошибки включают долгоживущие Access Tokens, отсутствие PKCE у публичных clients, отсутствие проверки audience, незашифрованную передачу, долгоживущие Refresh Tokens без возможности отзыва и неправильное использование ID Tokens вместо Access Tokens.

Продолжение в пути изучения API

Следующая статья в пути изучения API посвящена JWT Token: структура, безопасность и правильное использование — устройству JSON Web Tokens, схемам подписи и лучшим практикам безопасности.

Источники

  1. https://datatracker.ietf.org/doc/html/rfc6749
  2. https://openid.net/specs/openid-connect-core-1_0.html
  3. https://datatracker.ietf.org/doc/html/rfc7636

Рекомендуемые книги по безопасности API

Если хочешь углубиться в OAuth2, OpenID Connect и безопасность API, рекомендуем следующие книги:

Keine Bücher für Kategorie "security" gefunden.

Назад к блогу
Share:

Похожие статьи