Должны ли права доступа и роли быть включены в полезную нагрузку JWT?

9

Должна ли информация о разрешениях и ролях клиента быть включена в JWT?

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

Или,

Информация, подобная упомянутой выше, не должна быть частью JWT, и только база данных должна использоваться для проверки ролей доступа и разрешений пользователя?

Аншул Сахни
источник

Ответы:

7

Цель включения утверждений в токен состоит в том, чтобы вам не пришлось обмениваться данными между ресурсом и поставщиком аутентификации.

Ресурс может просто проверить, что токен имеет действительную подпись и доверять контенту.

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

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

Ewan
источник
Спасибо за прекрасный ответ. Могу ли я узнать больше о том, что вы имели в виду в своем заявлении «Некоторые провайдеры меняют свой ключ, чтобы снизить риск». ?
Аншул Сахни
1
Поэтому вместо того, чтобы иметь фиксированный ключ подписи, провайдер аутентификации будет периодически менять его и предоставлять конечным точкам для серверов ресурсов для загрузки общедоступной его половины. Ресурсы должны совершать вызовы на сервер аутентификации время от времени, но не один раз за запрос
Ewan
Таким образом, все токены недействительны каждый раз, когда служба
меняет
1
обычно они имеют более одного возможного ключа, так что в полете жетоны не будут аннулированы. токен будет содержать «идентификатор ключа», чтобы указать ресурсу, какой из них использовать
Ewan
Единственное, что мне здесь не хватает, - это как действовать, когда данные в JWT становятся недействительными. Скажем, роли изменились на стороне сервера, но клиент все еще держит маркер со всем набором ролей. Вы должны иметь возможность отзывать токены на стороне сервера, чтобы эти токены, содержащие устаревшую информацию, больше не действительны и не использовались для дальнейших запросов. Это соответствует тому, что Ewans как-то предлагает (позволяя серверу отзывать токен) по той или иной причине.
LAIV
1

По моему опыту, если все ваши системы используют какую-то центральную базу данных ролей и разрешений, вы можете добавить все это в JWT.

Однако этот подход может не сработать в сценариях единого входа, когда сам сервер аутентификации не имеет никакого представления о целевой системе, которая будет получать токен и доверять ему.

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

JustAMartin
источник
Я согласен с этим. Права доступа пользователя не должны быть частью jwt, особенно в SSO, так как idp не знает, с какими другими сервисами собирается общаться этот пользователь jwt. Вместо этого ресурс должен реализовывать часть авторизации после подтверждения личности для пользователя.
Маниш Рават
Я также согласен с тем, что заявки на разрешение в JWT не являются хорошей идеей, кроме простого монолитного API. Я написал пост в блоге об этом: sdoxsee.github.io/blog/2020/01/06/…
sdoxsee