OAuth 2.0 и OpenID Connect: Простое руководство за 15 минут

До OAuth 2.0: Проблемы обмена данными между сервисами

В прошлом обмен информацией между сервисами осуществлялся путём предоставления логина и пароля от одного сервиса другому. Это представляло серьёзную угрозу безопасности, так как не гарантировало сохранность данных и доступа к большему объёму информации, чем необходимо. Некоторые приложения до сих пор используют эту небезопасную практику.

OAuth 2.0: Безопасный доступ к данным

OAuth 2.0 — это стандарт безопасности, позволяющий одному приложению получить разрешение на доступ к информации в другом приложении, не требуя пароля пользователя. Он позволяет выдавать ограниченный набор прав, а не полный доступ к учётной записи.

Пример: Представьте сайт «Неудачный Каламбур Дня», на котором вы регистрируетесь, чтобы получать каламбуры. Чтобы поделиться сайтом с друзьями, вам нужно предоставить ему доступ к вашим контактам электронной почты. OAuth 2.0 позволяет сайту отправить приглашения вашим друзьям от вашего имени, не запрашивая ваш пароль. Вы управляете, какие данные и функции сайта могут использовать. Вы также можете в любой момент отозвать этот доступ.

Ключевые термины OAuth 2.0:

  • Resource Owner: Вы, владелец учётных данных.
  • Client: Приложение, запрашивающее доступ (например, «Неудачный Каламбур Дня»).
  • Authorization Server: Приложение, которое знает Resource Owner и его учётные данные (например, ваш почтовый сервис).
  • Resource Server: API или сервис, к которому Client хочет получить доступ от имени Resource Owner (например, список контактов вашей почты).
  • Redirect URI: Ссылка, на которую Authorization Server перенаправит пользователя после предоставления разрешения.
  • Response Type: Тип информации, ожидаемый Client (чаще всего — код авторизации).
  • Scope: Подробное описание запрашиваемых разрешений (например, доступ к контактам, отправка сообщений).
  • Client ID: Идентификатор Client на Authorization Server.
  • Client Secret: Пароль, известный только Client и Authorization Server.
  • Authorization Code: Временный код, который Client предоставляет Authorization Server в обмен на Access Token.
  • Access Token: Ключ, используемый Client для связи с Resource Server.

Поток авторизации с кодом авторизации (Authorization Code Grant):

  1. Client перенаправляет пользователя на Authorization Server с запросом (Client ID, Redirect URI, Response Type, Scope).
  2. Authorization Server проверяет пользователя (логин/пароль).
  3. Authorization Server выводит форму подтверждения (consent) с перечнем запрашиваемых Scopes.
  4. После согласия Resource Owner, Authorization Server перенаправляет пользователя на Redirect URI с Authorization Code.
  5. Client отправляет Authorization Code, Client Secret и другие данные на Authorization Server.
  6. Authorization Server проверяет данные и выдаёт Access Token.
  7. Client использует Access Token для запроса данных у Resource Server.

OpenID Connect: Аутентификация и информация о профиле пользователя

OpenID Connect — это дополнительный слой поверх OAuth 2.0, добавляющий информацию о профиле пользователя (идентификацию). Он позволяет реализовать единый вход (SSO) — использование одной учётной записи для доступа к множеству приложений.

Если Authorization Server поддерживает OpenID Connect, его называют Identity Provider (поставщик идентификации).

Поток авторизации в OpenID Connect:

Аналогичен OAuth 2.0, но в запросе используется Scope «openid», а Client получает Access Token и ID Token.

  • ID Token: JSON Web Token (JWT), содержащий информацию о пользователе (ID, имя, время входа и т.д.).

OAuth 2.0 и OpenID Connect: Сравнение

  • OAuth 2.0: Протокол авторизации, предоставляющий доступ к ресурсам.
  • OpenID Connect: Протокол аутентификации, добавляющий информацию о пользователе к OAuth 2.0.

OAuth 2.0 и OpenID Connect — важные стандарты безопасности, обеспечивающие безопасный обмен данными между приложениями без необходимости раскрытия паролей пользователей. Понимание их принципов работы необходимо разработчикам и администраторам систем.

Что будем искать? Например,программа