Ответ
Ключевое различие: 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
В этом примере приложение:
- Аутентифицирует пользователя (
openid
). - Запрашивает его профиль (
profile
). - Запрашивает право на чтение его календаря (
calendar.events.readonly
).