В чем разница между аутентификацией на основе OAuth и на основе токенов?

Я думал, что OAuth - это в основном спецификация аутентификации на основе токенов, но в большинстве случаев фреймворки действуют так, как будто между ними есть разница. Например, как показано на рисунке ниже, Jhipster спрашивает, использовать ли аутентификацию на основе OAuth или на основе токенов.

Разве это не одно и то же? В чем именно разница, поскольку оба включают токены в свои реализации?

введите описание изображения здесь


person Cemre Mengü    schedule 14.01.2016    source источник


Ответы (3)


Это хороший вопрос - много путаницы вокруг токенов и OAuth.

Во-первых, когда вы упоминаете OAuth, вы, вероятно, имеете в виду стандарт OAuth2. Это последняя версия протокола OAuth, и именно об этом говорит большинство людей, когда говорят «OAuth».

Протокол OAuth поддерживает несколько различных типов аутентификации и авторизации (если быть точным, то 4).

Во-вторых, протокол OAuth работает путем аутентификации пользователей с помощью токенов. Идея вот такая:

Вместо того, чтобы ваш пользователь отправлял свои фактические учетные данные на ваш сервер при каждом отдельном запросе (как в случае с базовой аутентификацией, когда пользователь отправляет свое имя пользователя / пароль на сервер для каждого запроса), с помощью OAuth вы сначала обмениваете свои учетные данные на «токен», а затем аутентифицировать пользователей на основе этого «токена».

Идея OAuth заключается в том, что, требуя от пользователей реже передавать свои конфиденциальные учетные данные по сети, может случиться меньше неприятностей. (Во всяком случае, это идея.)

Теперь, вот где в игру вступают токены: спецификация OAuth построена на концепции токенов, но НЕ УКАЗЫВАЕТ, ЧТО ТАКОЕ ТОКЕН.

В самом «общем» смысле токен - это просто строка, которая однозначно идентифицирует пользователя. Вот и все.

Люди поняли это и разработали новый стандарт для создания токенов, названный стандартом JSON Web Token. Этот стандарт в основном предоставляет набор правил для создания токенов особым образом, что делает токены более полезными для вас в целом.

JWT позволяют делать такие вещи, как:

  • Криптографически подпишите токен, чтобы вы знали, что токен не был подделан пользователем.
  • Зашифруйте токены, чтобы их нельзя было прочитать в виде обычного текста.
  • Встраивайте данные JSON ВНУТРИ строки токена стандартным способом.

Теперь по большей части: почти все в сообществе разработчиков согласились с тем, что если вы используете какой-либо тип OAuth, то используемые вами токены должны быть веб-токенами JSON.

==========

OK! Теперь, когда мы рассмотрели предысторию, позвольте мне ответить на ваш вопрос.

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

Поскольку протокол OAuth предоставляет несколько различных способов аутентификации в соответствии со СТАНДАРТАМИ, он значительно усложняет большинство систем аутентификации.

Из-за этого многие фреймворки предлагают «упрощенную» версию потока предоставления пароля OAuth2, который, по сути, представляет собой простой метод, в котором:

  • Пользователь отправляет свое имя пользователя / пароль на ваш сервер по некоторому URL-адресу, например / login.
  • Ваш сервер генерирует токен JWT для пользователя.
  • Ваш сервер возвращает этот токен пользователю.
  • Пользователь хранит этот токен в своих файлах cookie, на мобильном устройстве или на возможном сервере API, где он использует его для выполнения запросов.

Опять же: приведенный выше поток НЕ совместим с OAuth, но представляет собой немного более простую версию, в которой ВСЕ ЕЩЕ используются токены.

Главное здесь то, что токены (JWT) обычно полезны, и их НЕ НУЖНО связывать с потоком OAuth.

Я понимаю, что это стена текста, но, надеюсь, она ответит на ваш вопрос более подробно =)

person rdegges    schedule 21.01.2016
comment
Хороший ответ, но следует отметить, что сам OAuth2 не может использоваться для аутентификации пользователей (клиент ничего не знает о пользователе, если конечная точка API не доступна). OpenID Connect должен быть реализован для выполнения аутентификации на основе OAuth2. - person Spomky-Labs; 01.01.2017
comment
Это правильно. Я не стал вдаваться в подробности, потому что не хотел слишком путать ОП. Но вы на 100% правы. - person rdegges; 02.01.2017
comment
@rdegges, не могли бы вы объяснить, почему описанный вами простой алгоритм не совместим с OAuth? Что вам нужно добавить к нему, чтобы сделать его совместимым с OAuth? - person hattenn; 04.04.2017
comment
@hattenn, вот статья (oauth.net/articles/authentication), в которой подробно объясняется, почему не совместим с oAuth: - person RayLoveless; 12.04.2017
comment
@RayLoveless Я прочитал эту статью, но до сих пор не совсем уверен, почему указанный выше пункт не соответствует OAuth2 для потока предоставления пароля. Не могли бы вы уточнить? - person skaterdav85; 22.04.2017
comment
@ skaterdav85 это потому, что OAuth указывает URL-адрес, который должен обслуживать запрос (/ oauth / token), а также конкретные параметры запроса и параметры тела для имен полей. Это очень специфично. - person rdegges; 09.08.2017
comment
Этот ответ вводит в заблуждение. Oauth - это не структура аутентификации, это структура авторизации. - person Nithin; 30.09.2018
comment
Я уже говорил об этом выше @nithin - я специально назвал это так, чтобы упростить понимание для читателей. - person rdegges; 01.10.2018
comment
@rdegges OAuth не отправляет пароль на сервер. Он просит пользователя подтвердить свою основную информацию с другого сервера. Например: Spotify использует API Facebook для доступа к вашему имени пользователя и изображению профиля. В этом случае Spotify отправляет запрос на авторизацию, и параллельно вы предоставляете ему разрешение, затем авторизация предоставляется и отправляется на spotify, и получает токен, который позволяет вам в этом случае получить доступ только к имени пользователя и изображению профиля. Теперь Spotify получает только имя пользователя и изображение профиля из FB и отображается в пользовательском интерфейсе. - person Mikz; 21.11.2018
comment
@Mikz ты неверен. Это зависит от того, какой тип OAuth вы используете. Существуют разные типы грантов, и они используются по-разному. Из-за вопроса, который задал OP, я включил подробную информацию о типе предоставления учетных данных клиента, о котором говорил его вопрос. Очевидно, что есть и другие режимы, но все они включают учетные данные в IDP. - person rdegges; 25.11.2018
comment
@rdegges Спасибо за разъяснения. Я следил за учебником и наткнулся на это утверждение. Извините, если это сбивало с толку - person Mikz; 03.12.2018
comment
Классное объяснение в одном месте, спасибо! У меня все эти мысли в беспорядке, но теперь я вижу их по порядку. - person Klyuch; 13.05.2021

Когда вы запрашиваете ресурс у защищенной веб-службы, вы можете предоставить токен аутентификации при вызове. Маркер действует как «секретный код» для доступа к ресурсу.

OAuth - это просто определенный тип метода аутентификации на основе токенов.

person lipponen    schedule 14.01.2016

OAuth - это спецификация авторизации, а не аутентификации

OAuth 2.0 - это спецификация для авторизации, но НЕ для аутентификации. RFC 6749, 3.1. Конечная точка авторизации прямо говорит следующее:

Конечная точка авторизации используется для взаимодействия с владельцем ресурса и получения разрешения на авторизацию. Сервер авторизации ДОЛЖЕН сначала проверить личность владельца ресурса. Способ, которым сервер авторизации аутентифицирует владельца ресурса (например, имя пользователя и пароль для входа, файлы cookie сеанса), выходит за рамки данной спецификации.

Используйте OAuth только в том случае, если вы хотите предоставить доступ к API сторонней службы. Даже когда вы используете OAuth, вам потребуется какая-то аутентификация (на основе токена или сеанса и т. Д.) Для аутентификации использования. OAuth не предназначен для аутентификации.

см. этот вопрос.

person Nithin    schedule 27.09.2018