Как аутентифицировать каждый API для авторизации пользователя?

#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. Это микросервис, поэтому его также нельзя хранить в локальном хранилище. Итак, дайте мне знать любой другой лучший подход к этому.