Протокол OAuth 2.0: преимущества и варианты - почему?
может ли кто-нибудь объяснить, что хорошо в OAuth2 и почему мы должны его реализовать? Я спрашиваю, потому что я немного смущен об этом - вот мои текущие мысли:
oauth1 (точнее HMAC) запросы кажутся логичными, легко понять, легко разработать и действительно, действительно безопасно.
OAuth2 вместо этого приносит запросы на авторизацию, токены доступа и токены обновления, и вам нужно сделать 3 запроса в самом начале сеанса, чтобы получить данные, которые вам нужны. И даже затем один из ваших запросов в конечном итоге завершится неудачей, когда токен истечет.
и чтобы получить другой маркер доступа, вы используете маркер обновления, который был передан одновременно с маркером доступа. Делает ли это маркер доступа бесполезным с точки зрения безопасности?
плюс, как недавно показал /r/netsec, SSL не совсем безопасен, поэтому толчок, чтобы получить все на TLS/SSL вместо безопасного HMAC, смущает меня.
OAuth утверждают, что это не о безопасности 100%, но получать его опубликованным и законченным. Это не звучит многообещающе с точки зрения провайдера. Я вижу, что проект пытается достичь, когда он упоминает о 6 разных потоков, но это просто не сочеталось в моей голове.
Я думаю, что это может быть больше Моя борьба, чтобы понять, что это преимущества и рассуждения, чем на самом деле не нравится, так что это может быть немного необоснованной атаки, и извините, если это может показаться напыщенной.
3 ответов:
фон: я написал клиентские и серверные стеки для OAuth 1.0 a и 2.0.
оба протокола OAuth 1.0 и 2.0 Поддержка двуногая аутентификация, где сервер уверен в идентичности пользователя, и трехногая проверки подлинности, где сервер гарантирован поставщиком контента идентичности пользователя. Трехногая аутентификация-это то, где запросы на авторизацию и маркеры доступа вступают в игру, и важно отметить, что OAuth 1 имеет их, тоже.
комплекс один: трехногая аутентификация
основной пункт спецификаций OAuth предназначен для контент-провайдер (например, Facebook, Twitter и др.) для обеспечения сервер (например, веб-приложение, которое хочет поговорить с поставщиком контента от имени клиента), что клиент имеет некоторую идентичность. То, что предлагает трехногая аутентификация, - это возможность сделать это без клиента или сервера не нужно знать детали этого идентичность (например, имя пользователя и пароль).
без (?) слишком углубляясь в детали OAuth:
- клиент отправляет запрос авторизации на сервер, который проверяет, что клиент является законным клиентом своей службы.
- сервер перенаправляет клиента к поставщику контента для запроса доступа к его ресурсам.
- поставщик контента проверяет личность пользователя и часто запрашивает его разрешение доступ к ресурсу.
- поставщик контента перенаправляет клиента обратно на сервер, уведомляя его об успехе или неудаче. Этот запрос включает код авторизации при успешном выполнении.
- сервер делает внеполосный запрос к поставщику контента и обменивает код авторизации на маркер доступа.
теперь сервер может делать запросы к поставщику контента от имени пользователя, передавая маркер доступа.
каждый exchange (client->server, server->content provider) включает проверку общего секрета, но поскольку OAuth 1 может работать через незашифрованное соединение, каждая проверка не может передать секрет по проводу.
это сделано, как вы заметили, с HMAC. Клиент использует секрет, которым он делится с сервером, чтобы подписать аргументы для своего запроса на авторизацию. Сервер принимает аргументы, подписывает их сам ключом клиента и может видеть, является ли это законным клиентом (в Шаг 1 выше).
эта подпись требует, чтобы клиент и сервер согласовали порядок аргументов (поэтому они подписывают точно такую же строку), и одна из основных жалоб на OAuth 1 заключается в том, что он требует, чтобы сервер и клиенты сортировали и подписывали одинаково. Это верный код, и либо это правильно, либо вы получите
401 Unauthorizedс небольшой помощью. Это увеличивает барьер для написания клиента., требуя, чтобы запросить разрешение работать по протоколу SSL, OAuth 2.0 полностью устраняет необходимость в сортировке и подписывании аргументов. Клиент передает свой секрет на сервер, который проверяет его напрямую.
те же требования присутствуют в соединении server->content provider, и поскольку это SSL, который удаляет один барьер для записи сервера, который обращается к службам OAuth.
что делает вещи намного проще в шагах 1, 2 и 5 выше.
таким образом, на данный момент наш сервер имеет постоянный токен доступа, который является имя пользователя/пароль эквивалентны для пользователя. Он может делать запросы к поставщику контента от имени пользователя, передавая этот маркер доступа как часть запроса (в качестве аргумента запроса, заголовка HTTP или данных формы POST).
если доступ к контенту осуществляется только через SSL, мы закончили. Если он доступен через простой HTTP, мы хотели бы каким-то образом защитить этот постоянный токен доступа. Любой, кто нюхает соединение, сможет получить доступ к контенту пользователя навсегда.
способ, который решается в OAuth 2, - это с маркер. Токен обновления становится эквивалентом постоянного пароля, и это только когда-либо передавалось по SSL. Когда серверу требуется доступ к службе содержимого, он обменивает маркер обновления на маркер кратковременного доступа. Таким образом, все нюхательные HTTP-обращения выполняются с токеном, срок действия которого истекает. Google использует 5-минутный срок действия на своих API OAuth 2.
Так помимо токенов обновления, OAuth 2 упрощает все коммуникации между клиентом, сервером и поставщиком контента. И токены обновления существуют только для обеспечения безопасности при доступе к содержимому в незашифрованном виде.
двуногая аутентификация
Иногда, однако, сервер просто должен контролировать доступ к своему собственному контенту. Двуногая аутентификация позволяет клиенту аутентифицировать пользователя непосредственно на сервере.
OAuth 2 стандартизирует некоторые расширения для OAuth 1, которые широко использовались. Тот, кого я знаю лучше всего, был представлен Twitter как xAuth. Вы можете увидеть его в OAuth 2 как Пароль Владельца Ресурса Учетные Данные.
по существу, если вы можете доверять клиенту учетные данные пользователя (имя пользователя и пароль), они могут обмениваться ими непосредственно с поставщиком контента для маркера доступа. Это делает OAuth гораздо более полезным в мобильных приложениях-с трехногой аутентификацией вам нужно встроить Точки зрения HTTP для того, чтобы справиться с процессом авторизации с сервером содержимого.
С OAuth 1 это не было частью официального стандарта и требовало такой же процедуры подписания, как и все другие запросы.
Я только что реализовал серверную часть OAuth 2 с учетными данными пароля владельца ресурса, и с точки зрения клиента получение маркера доступа стало простым: запросите маркер доступа с сервера, передав идентификатор/секрет клиента в качестве авторизации HTTP заголовок и логин/пароль пользователя в виде данных формы.
Преимущество: Простота
таким образом, с точки зрения разработчика, основные преимущества, которые я вижу в OAuth 2, заключаются в уменьшении сложности. Это не требует процедуры подписания запроса, что не совсем сложно, но, безусловно, неудобно. Это значительно сокращает работу, необходимую для того, чтобы выступать в качестве клиента сервиса, где (в современном, мобильном мире) вы больше всего хотите минимизировать боль. Уменьшенная сложность на сервер- > content provider end делает его более масштабируемым в центре обработки данных.
и он кодирует в стандарт некоторые расширения для OAuth 1.0 a (например, xAuth), которые теперь широко используются.
во-первых, как четко указано в аутентификации OAuth
OAuth 2.0 не является протоколом аутентификации.
аутентификация в контексте доступа пользователя к приложению сообщает приложению, кто является текущим пользователем и присутствуют ли они. Полный протокол аутентификации, вероятно, также сообщит вам ряд атрибутов об этом пользователе, таких как уникальный идентификатор, адрес электронной почты и что называть их, когда приложение говорит " Хорошо Утро."
однако OAuth не сообщает приложению ничего из этого. OAuth абсолютно ничего не говорит о пользователе, и он не говорит, как пользователь доказал свое присутствие или даже если они все еще там. Что касается клиента OAuth, он запросил маркер, получил маркер и в конечном итоге использовал этот маркер для доступа к некоторому API. Он ничего не знает о том, кто авторизовал приложение или если там вообще был пользователь.
существует стандарт для аутентификации пользователей использование OAuth: OpenID Connect, совместимый с OAuth2.
маркер идентификатора подключения OpenID-это подписанный веб-маркер JSON (JWT), который предоставляется клиентскому приложению вместе с обычным маркером доступа OAuth. Маркер ID содержит набор утверждений о сеансе аутентификации, включая идентификатор пользователя (sub), идентификатор поставщика удостоверений, выдавшего маркер (iss), и идентификатор клиента, для которого этот маркер был создан (aud).
В Go, вы можете посмотреть на coreos/dex, идентификатор OpenId Connect (OIDC) и поставщик OAuth 2.0 с подключаемым разъемом.
ответ с этого поста vonc
Я бы ответил на этот вопрос немного по-другому, и я буду очень точным и кратким, главным образом потому, что @Peter T ответил на все это.
основной выигрыш, который я вижу из этого стандарта, заключается в соблюдении двух принципов:
- разделение проблем.
- отключение аутентификации от веб-приложения, которое обычно обслуживает бизнес.
таким образом,
- вы можете реализовать альтернативу Single SignOn: если у вас есть несколько приложений, которые доверяют друг СТС. Что я имею в виду, одно имя пользователя для всех приложений.
- вы можете включить веб-приложение (клиент) для доступа к ресурсам, которые принадлежат Пользователю, и не относятся к веб-приложением (клиентом).
- вы можете поручить процесс аутентификации третьей стороне, которой Вы доверяете, и никогда не беспокоиться о проверке подлинности пользователя.
Comments