Как обрабатывать авторизацию с разрешениями / ролями при использовании JWT
Я столкнулся с проблемой при реализации авторизации в моем первом приложении nodejs, которое использует для аутентификации expressjs, sequelize и jsonwebtoken. Внутри я хочу запретить / разрешить маршруты для другого пользователя, и я не хочу использовать другой пакет, такой как oauth2 или что-то, что обрабатывает авторизацию для меня.
На данный момент я создал jsonwebtoken, в котором роли разрешений включены в полезную нагрузку:
{
"userid": 1,
"name": "John Doe",
"permissions" : ["user_get", "user_post", "user_put"]
"iat": 1505142542,
"exp": 1505146142
}
Нет, я хочу проверить в вызове, как "GET /user", разрешено ли аутентифицированному пользователю вызывать его.
Мой вопрос: безопасно ли использовать этот подход или я не должен включать разрешения в JWT? Другой альтернативой является запрос базы данных и получение разрешения вместо проверки полезной нагрузки.
Кроме того, токен будет проверен, если он все еще проверен в случае, если сервер делает пользователя недействительным.
2 ответа
JWT безопасен и хорош. Если вы знаете OAuth2, вы можете даже реализовать его более простую версию.
- Зарегистрируйте пользователя, дайте ему набор учетных данных, предположим, user_id и пароль (также называемый clientid и secret).
- Всякий раз, когда пользователь регистрируется впервые, возвращайте JWT с установленным временем истечения, как вы делаете это прямо сейчас.
- Как вы упомянули, используйте его для проверки прав доступа.
- Если JWT истекает, пользователь может запросить новый, указав user_id и пароль.
Теперь, что я хотел бы предложить, если вы не собираетесь использовать
"userid": 1,
"name": "John Doe"
нигде после проверки разрешения пользователя на доступ к API, тогда вообще не храните их в JWT. Вместо этого используйте подпись для вашего JWT, таким образом, не нужно, чтобы данные пользователя передавались по сети.:)
Да, JWT очень безопасно хранить конфиденциальные данные.
Для дополнительной настройки вы можете обновлять токен jwt при каждом запросе, поэтому всякий раз, когда клиент отправляет вам токен jwt. Каждый запрос будет проверять пользователя с помощью токена jwt. И каждый ответ отправит клиента на новый токен jwt для следующего запроса.