#node.js #authentication #redis #authorization #roles
#node.js #аутентификация #redis #авторизация #роли
Вопрос:
Я хотел бы авторизовать пользователей для каждого вызова api. Например: app.post('/user', isAuth('user.write'), controller);
Вышеуказанный api требует user.write
роли, так как же каждый раз проверять, есть у пользователя эта роль или нет? Функция isAuth проверяет этого пользователя.
По моему мнению, мы можем сохранять все роли пользователей во время входа в redis и при каждом вызове api извлекать их из redis.
Но ролей больше 1500, не усложнит ли это? Или я должен проверять базу данных для каждого API?
Или любой другой лучший способ, чтобы я мог легко проверять каждый API для пользователя?
Ответ №1:
Вы могли бы использовать токены JWT.
Затем ваш API выдаст токен JWT пользователю, у которого есть роли.
Затем пользователь предоставляет этот токен для каждого запроса, и вам не нужно совершать вызовы redis, потому что вы просто декодируете токен JWT и проверяете роли оттуда.
Токен JWT подписывается сервером и не может быть изменен клиентом, поэтому вы знаете, что роли — это роли, фактически предоставленные с сервера.
Подробнее о безопасности JWT читайте в этой статье
Популярной библиотекой для работы с токенами JWT в node является node-jsonwebtoken, которая имеет более 10000 звезд на GitHub.
Комментарии:
1. Но мне нужно где-то сохранить этот JWT, в локальной памяти узла, которую я не могу сохранить, поскольку она является микросервисом, поэтому будет ли узел доступен для серверов, а также не может храниться в файлах cookie, так как размер jwt будет больше из-за данных более 1500 ролей. Поэтому у меня остался только один вариант — сохранить его в redis, чтобы я мог получить к нему доступ в любом месте. Или есть какой-нибудь другой лучший способ?
2. @ATULSHARMA Со стороны сервера вы никогда не должны хранить токен JWT. Каждый запрос от клиента должен просто включать этот токен. Однако, если есть пользователи с более чем 1000 ролями, полезная нагрузка JWT, вероятно, будет довольно большой. Использование токена JWT снижает нагрузку на базу данных (redis), поскольку вам никогда не придется обращаться к ней для аутентификации или проверки роли, но это также увеличивает общий размер запроса
3. В файлах cookie мы не можем использовать более 4 КБ, а JWT делает его более 60 КБ, которые также не могут быть переданы в заголовке. Поэтому я планирую сохранить его в redis. Это микросервис, поэтому его также нельзя хранить в локальном хранилище. Итак, дайте мне знать любой другой лучший подход к этому.