Проверки подлинности проверки подлинности против протокола OAuth


У меня есть новый спа-салон с модели проверки подлинности без гражданства с использованием проверки подлинности. Меня часто просят ссылаться на OAuth для потоков аутентификации, например, просить меня отправлять "токены-носители" для каждого запроса вместо простого заголовка токена, но я думаю, что OAuth намного сложнее, чем простая аутентификация на основе JWT. Каковы основные различия, должен ли я заставить аутентификацию JWT вести себя как OAuth?

Я также использую JWT в качестве моего XSRF-токена, чтобы предотвратить XSRF, но меня просят держать их отдельно? Должен ли я держать их отдельно? Любая помощь будет оценена и может привести к набору руководящих принципов для сообщества.

7 155

7 ответов:

TL; DR Если у вас есть очень простые сценарии, такие как одно клиентское приложение, один API, то он может не окупиться, чтобы перейти на OAuth 2.0, с другой стороны, множество разных клиентов (браузерных, собственных мобильных, серверных и т. д.), то соблюдение правил OAuth 2.0 может сделать его более управляемым, чем попытка прокатки вашей собственной системы.


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

будучи автономными (фактический токен содержит информацию о данном предмете), они также являются хорошим выбором для реализации механизмов аутентификации без сохранения состояния (aka Смотри мама, никаких сеансов!). Когда это происходит маршрут и единственное, что должна представить сторона, чтобы получить доступ к защищенному ресурсу, - это сам токен, рассматриваемый токен можно назвать токеном-носителем.

на практике то, что вы делаете, уже можно классифицировать на основе токенов на предъявителя. Однако учтите, что вы не используете токены на предъявителя, как указано в спецификациях OAuth 2.0 (см. RFC 6750). Это означало бы, полагаясь на Authorization HTTP заголовок и использование Bearer проверка подлинности схема.

Что касается использования JWT для предотвращения CSRF, не зная точных деталей, трудно установить обоснованность этой практики, но, честно говоря, это не кажется правильным и/или стоящим. Следующая статья (Cookies vs Tokens: окончательное руководство) может быть полезно прочитать на эту тему, особенно XSS и XSRF защита.

один последний совет, даже если вам не нужно идти полный OAuth 2.0, я настоятельно рекомендую при передаче вашего токена доступа в Authorization заголовок вместо того, чтобы идти с пользовательскими заголовками. Если они действительно являются токенами-носителями, следуйте правилам RFC 6750, если нет, вы всегда можете создать пользовательскую схему аутентификации и по-прежнему использовать этот заголовок.

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

(источник: RFC 6819, раздел 5.4.1)

OAuth 2.0 определяет протокол, т. е. определяет, как передаются токены, JWT определяет формат токена.

OAuth 2.0 и "аутентификация JWT" имеют схожий внешний вид, когда речь заходит о (2-й) стадии, когда клиент представляет токен серверу ресурсов: токен передается в заголовке.

но "проверки подлинности проверки подлинности" не является стандартным и не указать как клиент получает токен в первую очередь (1-й этап). Вот где находится воспринимаемая сложность OAuth исходит из: она также определяет различные способы, которыми клиент может получить маркер доступа от чего-то, что называется сервером авторизации.

таким образом, реальная разница заключается в том, что JWT-это просто формат токена, OAuth 2.0-это протокол (это мая использовать JWT в качестве формата токена).

во-первых, мы должны различать JWT и OAuth. В принципе, JWT-это формат токенов. OAuth-это платформа проверки подлинности, которая может использовать JWT в качестве маркера. Протокол OAuth используется на стороне сервера и на стороне клиента хранилища. Если вы хотите сделать реальный выход из системы, вы должны пойти с OAuth2. Аутентификация с помощью токена JWT не может выйти из системы на самом деле. Потому что у вас нет сервера аутентификации, который отслеживает токены. Если вы хотите предоставить API сторонним клиентам, вы также должны использовать OAuth2. OAuth2-это очень гибкий. Реализация JWT очень проста и не занимает много времени. Если ваше приложение нуждается в такой гибкости, вы должны пойти с OAuth2. Но если вам не нужен этот сценарий использования, реализация OAuth2 является пустой тратой времени.

XSRF токен всегда отправляется клиенту в каждом заголовке ответа. Не имеет значения, отправляется ли токен CSRF в токене JWT или нет, потому что токен CSRF защищен сам по себе. Поэтому отправка токена CSRF в JWT не требуется.

похоже, что все, кто ответил Здесь, пропустили спорный момент OAUTH

Из Википедии

OAuth-это открытый стандарт делегирования доступа, обычно используемый как способ для пользователей Интернета предоставлять веб-сайтам или приложениям доступ к их информации на других веб-сайтах, но без предоставления им паролей.[1] Этот механизм используется такими компаниями, как Google, Facebook, Microsoft и Twitter, чтобы позволить пользователям обмениваться информацией об их аккаунтах в сторонних приложениях или веб-сайтах.

ключевым моментом здесь является access delegation. Зачем кому-либо создавать OAUTH, когда есть аутентификация на основе id/pwd, поддерживаемая многофакторной аутентификацией, такой как OTPs, и далее может быть защищена JWTs, которые используются для обеспечения доступа к путям (например, области в OAUTH) и устанавливают срок действия доступа

нет смысла использовать OAUTH, если потребители получают доступ к своим ресурсам(вашим конечным точкам) только через их надежные веб-сайты (или приложения), которые снова размещены на ваших конечных точках

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

еще одно важное примечание:
Вы свободно используете слово authentication для JWT и OAUTH, но ни один из них не предоставляет механизм аутентификации. Да, один из них является механизмом токенов, а другой-протоколом, но после аутентификации они используются только для авторизации (управления доступом). Вы должны поддерживать OAUTH либо с помощью аутентификации типа OPENID, либо с помощью собственных учетных данных клиента

JWT (JSON Web Tokens)- Это просто формат маркера. Токены JWT-это закодированные в JSON структуры данных, содержащие информацию об эмитенте, предмете (претензиях), времени истечения срока действия и т. д. Он подписан для доказательства несанкционированного доступа и подлинности и может быть зашифрован для защиты информации о токене с использованием симметричного или асимметричного подхода. JWT проще, чем SAML 1.1/2.0 и поддерживается всеми устройствами, и он более мощный, чем SWT(простой веб-токен).

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

OpenID Connect - OpenID Connect строит поверх OAuth2 и добавляет аутентификацию. OpenID Connect добавьте некоторое ограничение к OAuth2, например конечную точку UserInfo, маркер ID, обнаружение и динамическое Регистрация провайдеров OpenID Connect и управление сеансами. JWT является обязательным форматом для токена.

защита CSRF - вам не нужно реализовывать защиту CSRF, если вы не храните токен в cookie браузера.

вы можете прочитать более подробную информацию здесь http://proficientblog.com/microservices-security/

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

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

вы можете прочитать больше об этом здесь

OAuth или JWT? Какой из них использовать и почему?

Jwt-это строгий набор инструкций для выдачи и проверки подписанных маркеров доступа. Маркеры содержат утверждения, которые используются приложением для ограничения доступа к пользователю

OAuth2 с другой стороны, это не протокол, а делегированная структура авторизации. подумайте очень подробное руководство, позволяющее пользователям и приложениям разрешать определенные разрешения для других приложений как в частных, так и в общедоступных настройках. OpenID Connect, который сидит на вершине OAUTH2 дает вам Аутентификация и Authorization.it сведения о том, как несколько различных ролей, пользователи в вашей системе, серверные приложения, такие как API, и клиенты, такие как веб-сайты или собственные мобильные приложения, могут аутентифицироваться друг с другом

Примечание oauth2 может работать с jwt, гибкой реализацией, расширяемой для различных приложений