Подтвердить что ты не робот

JWT (Json Web Token) Аудитория "aud" против Client_Id - Какая разница?

Я работаю над внедрением JWT access_token OAuth 2.0 на моем сервере аутентификации. Но я не знаю, каковы различия между требованиями JWT "aud" и значением заголовка client_id http. Они одинаковы? Если нет, можете ли вы объяснить разницу между этими двумя?

Мое подозрение заключается в том, что "aud" следует ссылаться на сервер ресурсов, а client_id должен ссылаться на одно из клиентских приложений, распознаваемых сервером аутентификации (например, веб-приложение или приложение IOS).

В моем текущем случае мой сервер ресурсов также является моим клиентом веб-приложения.

4b9b3361

Ответ 1

Как оказалось, мои подозрения были правильными. Заявка аудитории "aud" в JWT предназначена для ссылки на серверы ресурсов, которые должны принимать токен.

Как это сообщение просто добавляет:

Аутентификация маркера является предполагаемым получателем токена.

Значение аудитории - это строка - обычно базовый адрес доступ к ресурсу, например "https://contoso.com".

Client_id в OAuth ссылается на клиентское приложение, которое будет запрашивать ресурсы с сервера ресурсов.

Приложение-клиент (например, приложение IOS) запросит JWT с вашего сервера аутентификации. При этом он передает client_id и client_secret вместе с любыми учетными данными пользователя, которые могут потребоваться. Сервер авторизации проверяет клиента с помощью client_id и client_secret и возвращает JWT.

JWT будет содержать утверждение "aud" , которое указывает, какие серверы ресурсов имеют JWT. Если "aud" содержит "www.myfunwebapp.com", но клиентское приложение пытается использовать JWT на "www.supersecretwebapp.com", тогда доступ будет отклонен, поскольку этот сервер ресурсов увидит, что JWT не предназначен для Это.

Ответ 2

Требование JWT aud (Аудитория)

Согласно RFC 7519:

В заявлении "aud" (аудитория) указаны получатели, которые JWT    предназначен для. Каждый руководитель, предназначенный для обработки JWT MUST    идентифицировать себя со значением в заявке аудитории. Если основной    обработка претензии не идентифицирует себя со значением в     "aud", когда это требование присутствует, тогда JWT ДОЛЖЕН быть    отвергнуто. В общем случае значение "aud" представляет собой массив case-    которые содержат значение StringOrURI. в    особый случай, когда JWT имеет одну аудиторию, значение "aud" МОЖЕТ быть    единственная чувствительная к регистру строка, содержащая значение StringOrURI. The    интерпретация значений аудитории обычно зависит от конкретного приложения.   Использование этого требования ДОПОЛНИТЕЛЬНО.

Аудитория (aud), как определено спецификацией, является общей и специфична для приложения. Предполагаемое использование заключается в определении предполагаемых получателей токена. То, что означает получатель, относится к конкретным приложениям. Значение аудитории - это либо список строк, либо может быть одной строкой, если есть только один запрос aud. Создатель токена не гарантирует, что aud проверяется правильно, ответственность - это то, что получатель должен определить, должен ли использоваться токен.

Независимо от того, какое значение имеет значение, когда получатель проверяет JWT, и он хочет подтвердить, что токен был предназначен для использования для этого, он ДОЛЖЕН определить, какое значение в aud идентифицирует себя, а токен должен только проверять если объявленный идентификатор получателя присутствует в заявке aud. Не имеет значения, является ли это URL-адресом или какой-либо другой специфичной для приложения строкой. Например, если моя система решила идентифицировать себя в aud со строкой: api3.app.com, тогда она должна принимать только JWT, если в заявлении aud содержится api3.app.com в нем список значений аудитории.

Конечно, получатели могут отказаться игнорировать aud, поэтому это полезно только в том случае, если получатель хотел бы положительную проверку того, что маркер был создан специально для него.

Моя интерпретация, основанная на спецификации, заключается в том, что претензия aud полезна для создания целевых JWT, которые действительны только для определенных целей. Для одной системы это может означать, что вы хотите, чтобы токен был действительным для некоторых функций, но недействителен для других. Вы можете выдавать токены, которые ограничены только определенной "аудиторией", но при этом используются одни и те же ключи и алгоритм проверки.

Поскольку в типичном случае JWT генерируется доверенной службой и используется другими доверенными системами (системами, которые не хотят использовать недопустимые токены), эти системы просто должны координировать значения, которые они будут использовать.

Конечно, aud полностью необязателен и может быть проигнорирован, если ваш прецедент не оправдывает этого. Если вы не хотите ограничивать токены для использования определенными аудиториями, или ни одна из ваших систем не будет проверять токен aud, тогда это бесполезно.

Пример: токены доступа и обновления

Один из надуманных (хотя и простых) примеров, о которых я могу думать, возможно, мы хотим использовать JWT для доступа и обновления токенов без необходимости реализовывать отдельные ключи и алгоритмы шифрования, но просто хотим убедиться, что токены доступа не будут проверяться как обновленные токены, или наоборот.

Используя aud, мы можем указать требование refresh для токенов обновления и требование access для доступа к токенам при создании этих токенов. Когда делается запрос на получение нового токена доступа из токена обновления, нам нужно проверить, что токен обновления был подлинным токеном обновления. Валидация aud, как описано выше, скажет нам, действительно ли токен был действительным токеном обновления, специально рассматривая заявку refresh в aud.

Идентификатор клиента OAuth против JWT aud Требование

Идентификатор клиента OAuth полностью не связан и не имеет прямой корреляции с претензиями JWT aud. С точки зрения OAuth, токены являются непрозрачными объектами.

Приложение, которое принимает эти токены, отвечает за разбор и проверку значения этих токенов. Я не вижу большой ценности при указании идентификатора клиента OAuth в заявлении JWT aud.