Корпоративные шаблоны для аутентификации JWT для приложений на основе REST?

9

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

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

То, о чем я думал, это:

  • если заголовок авторизации не встречен, или токен JWT недействителен, или истек срок действия, отправьте HTTP 401
  • для аутентификации используйте / входите в REST канал, отправьте имя пользователя и пароль как объект JSON
  • чтобы поддерживать токен в рабочем состоянии, используйте / оставляйте канал REST / keepalive, вызывайте его каждые N (5) минут, получайте новый токен JWT и заменяйте существующий после каждого вызова (токен истекает через M (15) минут)

Однако меня беспокоит необходимость в этом / keepalive канале. С другой стороны, это вынуждает меня предотвращать истечение срока действия аутентификации, даже если пользователь отсутствует (решение, если мы хотим, чтобы keepalive еще не было выполнено), и, конечно, это дополнительные вызовы и дополнительное усложнение протокола. Что было бы интересно, так это то, что сервер автоматически продлевает токен. В среде, основанной на сеансах, это происходит путем сброса метки времени, однако здесь серверу придется отправлять новый токен, возможно, не каждый раз, а только после истечения срока действия токена через R (скажем, 10) минут. Но размещение его в теле ответа будет означать изменение протокола ответа JSON (следовательно, решение является инвазивным и непрозрачным), и добавление дополнительного заголовка HTTP, который может обработать клиент, не обязательно может быть хорошим шаблоном. Я'

Есть ли готовые шаблоны предприятия, которые отвечают моим открытым позициям? Является ли мой проект протокола надежной идеей? Я предпочел бы использовать что-то готовое, чем дизайн с нуля.


источник
1
Да. JWT заставил многих людей внедрять собственные «протоколы» и отбросить проверенный фреймворк. Чтобы найти правильное решение, важно четко определить требования. Похоже, истечение «сеанса» является обязательным требованием. Требуется ли принудительный выход из системы? то есть, где кто-то на стороне сервера может сказать, выйти из системы этого пользователя или пользователь может сказать, выйти из всех моих сеансов.
Joshp

Ответы:

4

JWT ( введение в JSON Web Token ) - это просто формат токена, аутентификация - это нечто, выходящее за рамки данной спецификации. Он действительно широко используется в системах аутентификации, но вы также можете использовать его для совершенно разных сценариев, поэтому имеет смысл не включать специфические ограничения аутентификации в эту спецификацию.

Если вы ищете руководство по аутентификации, вам следует обратиться к семейству спецификаций OpenID Connect . Кроме того, если ваша система состоит из HTTP API и вы заинтересованы в предоставлении делегированного доступа к этим API для вашего собственного или стороннего клиентского приложения, вам следует обратиться к спецификации OAuth 2.0 .

Существуют дополнительные протоколы, связанные с аутентификацией, такие как SAML и WS-Federation, которые все еще широко используются в корпоративных сценариях, но их значительно сложнее реализовать.

О ваших конкретных открытых точках:

  • Схема аутентификации маркера канала- носителя определена в RFC 6750, который содержит инструкции о том, как выполнять запросы и возможные коды ошибок .
  • OAuth2 и OpenID Connect рассматривают возможность и определяют способ обмена именем пользователя / паролем с токеном.
  • Проблема продления времени жизни автономного токена (JWT) решается в OpenID Connect и OAuth2 с помощью маркеров обновления .

Хотя OAuth2 и OpenID Connect могут показаться более простыми в реализации, чем некоторые из его предшественников, они все еще достаточно сложны, чтобы гарантировать некоторую осторожность и реализовывать их самостоятельно, только если вы готовы потратить значительное количество времени и ресурсов. Как правило, лучше использовать сторонние библиотеки или службы, которые делают это за вас.

Наконец, эти протоколы охватывают множество сценариев, поэтому в некоторых ситуациях они могут быть излишними.

Жоао Анжело
источник
2
+1 за предостережение и полный ответ на подразумеваемый вопрос, а не на письменный.
Пол
3

Я не думаю, что вам нужен канал поддержки активности. Ваша полезная нагрузка может (и рекомендуется) содержать информацию об истечении срока действия, предоставляемую сервером (в expключе, согласно стандарту ), когда токен генерируется при входе в систему. Если используется токен с истекшим сроком действия (который, очевидно, определяется сервером, который доверяет только тому, что находится в токене, если подпись проверяется), сервер просто отклоняет его с HTTP 401, побуждая клиента к повторной аутентификации.

Клиенты, тем временем, могут быть активными. Раздел полезной нагрузки не зашифрован, и, поскольку клиент может прочитать его, клиент может определить, когда запрос будет отправлен с токеном с истекшим сроком действия, и, следовательно, /loginповторно вызвать его, если токен истек.

В качестве альтернативы, REST позволяет отправлять гипермедиа информацию как «движок состояния», и поэтому, если вы хотите, вы можете сделать свой JWT одноразовым, а также с истечением срока действия. Каждый запрос будет генерировать новый JWT, который возвращается в ответе клиенту, либо в содержимом, либо, что более вероятно, в заголовке ответа, как это делает hapi-auth-jwt2 .

Павел
источник