Как обрабатывать авторизацию с разрешениями/ролями при использовании JWT

Я столкнулся с проблемой при реализации авторизации в моем первом приложении nodejs, которое использует для аутентификации expressjs, sequenceize и jsonwebtoken. Внутри я хочу запретить/разрешить маршруты для разных пользователей, и я не хочу использовать другой пакет, такой как oauth2 или что-то, что обрабатывает авторизацию для меня.

На данный момент я создал jsonwebtoken с ролями разрешений, включенными в полезную нагрузку:

{ 
    "userid": 1,  
    "name": "John Doe",  
    "permissions" : ["user_get", "user_post", "user_put"]
    "iat": 1505142542,  
    "exp": 1505146142
}

Нет, я хочу проверить в вызове типа «GET/user», разрешено ли аутентифицированному пользователю вызывать его.

Мой вопрос: безопасно ли использовать этот подход или мне не следует включать разрешения в jwt? Другой альтернативой является запрос базы данных и получение разрешения вместо проверки полезной нагрузки.

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


person paulknulst    schedule 11.09.2017    source источник
comment
Да, это так же безопасно, как веб-токены.   -  person Jonas Wilms    schedule 11.09.2017


Ответы (2)


JWT безопасен и хорош. Если вы знакомы с OAuth2, то можете реализовать даже его более простую версию.

  1. Зарегистрируйте пользователя, предоставьте ему набор учетных данных, предположим, user_id и пароль (также называемый clientid и secret).
  2. Всякий раз, когда пользователь регистрируется в первый раз, возвращайте JWT с установленным сроком действия, как вы делаете это прямо сейчас.
  3. Как вы упомянули, используйте его для проверки разрешений.
  4. Если срок действия JWT истекает, пользователь может запросить новый, указав user_id и пароль.

Теперь я бы посоветовал, если вы не собираетесь использовать

"userid": 1,  
"name": "John Doe" 

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

person TGW    schedule 11.09.2017

Да, JWT очень безопасно хранить конфиденциальные данные.

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

person Pankaj Jatav    schedule 11.09.2017
comment
Это действительно не очень хороший совет. JWT безопасен в том смысле, что он гарантирует, что им не манипулировали. Но вы можете легко прочитать содержимое его полезной нагрузки, потому что он просто закодирован в base64. Хранить конфиденциальные данные в токене, например, пароль, — не лучшая идея. - person jpgrassi; 03.01.2019
comment
Как упоминал @jpgrassi, JWT НЕ является безопасным местом для хранения конфиденциальных данных. Может быть безопасно хранить неконфиденциальные данные, поскольку это обеспечит гарантию целостности данных. - person faisal00813; 17.04.2019