Подтвердить что ты не робот

Почему я должен использовать OpenID для аутентификации, а не OAuth?

Я неоднократно читал, что OpenID лучше для аутентификации, чем OAuth (для авторизации), в том числе несколько других сообщений в SO.

Случай также, кажется, сделан в этой часто цитируемой статье.

Однако я немного не понимаю, почему я должен одобрять OpenID для аутентификации, а также честного поставщика OAuth (например, Twitter или Facebook OAuth 2.0). Другие сообщения SO, которые я прочитал, объясняют разные варианты использования, и я понимаю разницу между тем, что предназначены для протоколов, но они не объясняют, почему нельзя использовать OAuth для аутентификации.

Вот причины, которые я могу придумать, и мои (возможно, ошибочные) репсоны:

  • OAuth действительно для авторизации. Аутентификация пользователей с использованием OAuth дает потребителю больше привилегий, чем им нужно.
    • Ответ. Это, как правило, верно, но гораздо более ограниченным в случае мелкозернистого OAuth (например, для Facebook), который позволяет мне запрашивать только минимальные разрешения. Фактически, многие сайты, такие как Facebook, предоставляют OAuth, но не OpenID, по-видимому, потому, что они больше заинтересованы в авторизации потребителей, чем аутентификации клиентов. Если я хочу предоставить клиентам больше параметров проверки подлинности, OAuth, похоже, дает это мне.
  • Сеансы OAuth, как правило, живут дольше
    • Ответ: не имеет значения, если я намерен использовать клиента для аутентификации клиентов; Я сделаю свое собственное управление сеансом и сразу же избавлюсь от токенов OAuth, как только закончу своих пользователей.

Какие преимущества аутентификации предоставляют OpenID по сравнению с использованием широко распространенных поставщиков OAuth для аутентификации?

4b9b3361

Ответ 1

Основная проблема с использованием OAuth для аутентификации заключается в том, что вам нужно будет принять идентичность на основе доступа к данному ресурсу. В некоторых случаях это может быть допустимым предположением, но OAuth не гарантирует этого. Если доступ к ресурсу, который вы используете для аутентификации, делегируется другой стороне, и вы предполагаете, что идентификатор основан на доступе к этому ресурсу, то это уязвимость, которая может позволить самозванцу аутентифицироваться на другом абоненте. Это не имеет ничего общего с честностью или отсутствием поставщика OAuth, и все, что связано с инструментом, используемым таким образом, чтобы он не был разработан.

В случае с Facebook OAuth может поддерживать аутентификацию, основанную только на том, что абонент может разрешить приложение: если вы получаете авторизацию для доступа к отдельному профилю, это означает, что подписчик должен пройти аутентификацию в Facebook. Похоже, что это поддерживаемый прецедент. Однако, если Facebook позже позволяет, например, другим приложениям или пользователям разрешать ресурсы от имени своих подписчиков, тогда эта гарантия будет потеряна.

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

Можете ли вы смело сделать эти предположения? В случае с Facebook, возможно; они, как представляется, документированы и поддерживаются прецедентами (я не знаком с конкретным API). Но, как правило, это не поддерживаемый вариант использования OAuth.

Ответ 2

Главный вопрос, который вам нужно задать самому себе, - это то, что вы заранее знаете, какие провайдеры вы хотите поддерживать. Если вы хотите разрешить пользователям использовать какой-либо провайдер в своих целях (с поддержкой OpenID, такой как Google, Yahoo, AOL и т.д.), Вы должны использовать OpenID. Но если вы знаете, что большинство ваших пользователей захотят использовать Twitter, Facebook или один из других популярных поставщиков OAuth, используйте их.

Техническая терминология заключается в том, что OAuth предоставляет делегированную аутентификацию, в то время как OpenID обеспечивает федеративную аутентификацию. Теперь верно, что OAuth является протоколом авторизации, а не протоколом аутентификации, но, предоставляя вам /me (Facebook) или /account/verify _credentials (Twitter), эти поставщики расширили OAuth для использования в качестве протокола проверки подлинности.

Но вы не должны использовать OpenID. Это мертвый протокол.