Аудитория JWT (JSON Web Token) "aud" против идентификатора клиента - в чем разница?

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

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

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

2 ответов


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

As этой post просто ставит его:

аудитория знак-получатель знака.

аудитории значение является строкой, как правило, базовый адрес доступ к ресурсам, таким как "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 on "www.supersecretwebapp.com", тогда доступ будет запрещен, потому что этот сервер ресурсов увидит, что JWT не предназначен для него.


процесса JWT aud (Аудитория) Claim

по данным RFC 7519:

утверждение "aud" (аудитория) определяет получателей, что JWT предназначен для. Каждый Принципал, предназначенный для обработки JWT, должен отождествляйте себя с ценностью в притязаниях аудитории. Если директор обработка претензии не идентифицирует себя со значением в претензия " 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 утверждение полезно для создания целевых JWTs, которые действительны только для определенных целей. Для одной системы это может означать, что вы хотите, чтобы токен был действителен для некоторых функций, но не действительно для других. Вы можете выпускать токены, ограниченные только определенной "аудиторией", при этом используя те же ключи и алгоритм проверки.

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

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

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

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

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

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

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

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