Соединение точек: глубокое исследование ресурсов OIDC и ваших JWT-токенов доступа
Этот блог стремится пролить свет на отношения между индикаторами ресурса OIDC и их ролью в получении токенов доступа.
Предыстории
Впредыдущей сессии, мы предоставили введение в протокол OpenID Connect (OIDC), токены обновления, токены доступа и идентификаторы токенов, необходимые компоненты для создания надежной аутентификации в вашем приложении. Однако вопросы все еще остаются в нашем сообществе, с одним повторяющимся запросом: "Почему мой токен доступа не является JWT?”
Этот блог стремится пролить свет на отношения между индикаторами ресурса OIDC и их ролью в получении токенов доступа для тех, кто впервые знакомится с этими концепциями, или даже для тех, кто нуждается в повторении.
Понимание ресурса OIDC
Если вы знакомы с протоколом OAuth 2.0, то термин"ресурс" должен прозвучать знакомо. Поскольку OIDC основан на OAuth 2.0, он наследует эту же концепцию.
"Ресурс" или "защищенный ресурс" - это представление сущности, досту п к которой клиентское приложение хочет получить от имени аутентифицированного пользователя. Это может быть информация о пользователе, API сервера или любые другие данные, авторизованные вашим сервером.
Согласно протоколу, ресурс - это параметр в запросах на сервер авторизации. Это значение, представленное в виде абсолютного URI, например, https://my-company.com/api
. Он выступает в качестве идентификатора ресурса, возможно соответствующего адресуемому по сети местоположению или даже уникальному, но выдуманному URI.
В Logto вы можете создать "API ресурс" через страницу "Admin Console → API resources". Вы можете обратиться к данной документации для получения дополнительной информации.
JWT-токен доступа
Формат токена доступа JWT выдается только в том случае, если при запросе токена доступа указан параметр "ресурс", и он несет набор утверждений, которые вы можете расшифровать и проверить, например, чтобы гарантировать целостность токена и права пользователя.
Этот "ресурс" становится одним из утверждений токена aud
в JWT, указывающим предполагаемую аудиторию для токена. См. RFC-7519.
Таким образом, становится ясной следующая связь:
- Указывайте индикатор ресурса при запросе токена JWT.
- Индикатор ресурса соответствует заявке токена
aud
. - При выполнении запросов API токен доступа JWT должен быть включен в заголовок токена передатчика. Ваш API-сервер должен расшифровывать и проверять заявку
aud
и другие заявки, связанные с разрешениями, чтобы обеспечить безопасность запроса API. - Каждый токен доступа соответствует одному ресурсу. Если у вас зарегистрировано несколько ресурсов API с разными URI, запросите отдельные токены доступа для каждого.
🤔 Но что, если клиент не указывает ресурс при запросе токена доступа?
Непрозрачный токен доступа
В случае с Logto, если индикатор ресурса не указан при запросе токена доступа, сервер авторизации предполагает, что он предназначен для конечной точки OIDC /userinfo
, и, таким образом, выдается непрозрачный токен доступа, который клиент может использовать позже для запроса профиля пользователя, такого как ID пользователя, имя, электронная почта и т.д., из конечной точки информации о пользователе OIDC.
В любом SDK Logto вы можете получить такой токен, если вызовете getAccessToken()
или напрямую запросите конечную точку токена OIDC без указания параметра resource
.
Обратите внимание, что этот непрозрачный токен доступа не подходит для запросов вашего собственного API-ресурса, так как нет способа его проверить без запроса сервера OIDC.
В итоге
OIDC ресурсы определяют конкретны е данные или услуги, к которым клиентское приложение хочет получить доступ от имени пользователя, с JWT-токенами доступа, служащими безопасным средством для этого доступа. Заявка "aud" в JWT-токенах доступа соответствует индикатору ресурса, помогая серверам при проверке разрешений при клиентских запросах.
В Logto непрозрачный токен доступа предназначен исключительно для извлечения информации о профиле пользователя из конечной точки информации о пользователе OIDC, в то время как клиенты могут запросить несколько токенов доступа, каждый из которых посвящен конкретному ресурсу.
Мы надеемся, что этот блог поможет развеять все сомнения и соединить точки для вас. Не стесняйтесь сообщить нам свои мысли.