Действительно ли необходимо иметь полезную нагрузку, встроенную в JWT? - PullRequest
1 голос
/ 16 марта 2020

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

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

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

В настоящее время я отправляю: (это ExpressJs код)

const jwt = jwtUtils.buildToken(user);
res.json({ jwt });

Где jwt содержит полезную нагрузку с информация о пользователе.

Но что если я сделаю вместо этого:

const user = userModel.get(userId);
const jwt = jwtUtils.buildToken();
res.json({ jwt, user });

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

Что мне не хватает?

1 Ответ

0 голосов
/ 16 марта 2020

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

Согласно RFC719, раздел 4.1 все заявки помечаются как необязательные.

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

Так что в большинстве приложений достаточно ограничить полезную нагрузку только пользователем id и, как правило, также метку времени истечения.

Например:

{
  "exp": "1516239022",
  "id": 1
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...