В чем заключается разница между scope в протоколах OpenID Connect и OAuth 2.0

Ответ

Ключевое различие: scope в OAuth 2.0 определяет разрешения (что приложение может делать), а в OpenID Connect (OIDC) — какие данные о пользователе можно получить.

1. scope в OAuth 2.0 — Авторизация (Permissions)

Определяет права доступа (полномочия), которые клиентское приложение запрашивает к защищенному ресурсу (API) от имени пользователя. Это ответ на вопрос: "Что приложению разрешено делать?"

  • Назначение: Ограничение доступа к API.
  • Формат: Обычно строки, описывающие действия или сущности (например, read:profile, write:posts).

Примеры:

  • repo: полный доступ к репозиториям пользователя (GitHub API).
  • calendar.events.readonly: право только на чтение событий календаря (Google Calendar API).
  • messages.send: право отправлять сообщения от имени пользователя.

2. scope в OpenID Connect — Аутентификация (User Info)

OIDC — это слой аутентификации поверх OAuth 2.0. Его scope определяет, какие наборы данных (claims) о пользователе будут возвращены в id_token или через эндпоинт UserInfo. Это ответ на вопрос: "Что приложение может узнать о пользователе?"

  • Назначение: Запрос информации о пользователе.
  • Формат: Стандартизированные значения.

Примеры:

  • openid: Обязательный scope, который сигнализирует о выполнении процесса аутентификации OIDC.
  • profile: Запрашивает доступ к базовым данным профиля (имя, фамилия, фото и т.д.).
  • email: Запрашивает доступ к email-адресу пользователя.
  • address: Запрашивает доступ к физическому адресу.

Совместное использование

В одном запросе авторизации часто комбинируются оба типа scope, так как приложению обычно нужно и аутентифицировать пользователя, и получить права на действия от его имени.

Пример запроса:

.../authorize?
response_type=code&
client_id=MY_CLIENT_ID&
redirect_uri=https://client.app/callback&
scope=openid%20profile%20calendar.events.readonly

В этом примере приложение:

  1. Аутентифицирует пользователя (openid).
  2. Запрашивает его профиль (profile).
  3. Запрашивает право на чтение его календаря (calendar.events.readonly).