Как ни странно, путаница в понятиях "OpenID" и "OAuth" встречается довольно часто. Люди используют их как взаимозаменяемые термины или считают OAuth своего рода новой улучшенной версией OpenID. Но на самом деле это совершенно разные вещи. Чтобы было куда ссылаться в таких случаях, пишу пост.

Этот пост не о том, что из этих двух слов "лучше", что "зло" или что "умерло". Это просто констатация фактов.

Суть

OpenID позволяет сайту удостовериться, что его пользователь владеет неким персональным URL (своим сайтом, блогом, профилем). Этого факта достаточно для того, чтобы использовать уникальный URL для узнавания того же самого пользователя в следующий раз. И всё. Все остальные вещи — заведение аккаунта, получение email'а и других данных, разрешение какой-то активности на сайте — остаётся на усмотрение сайта. Другими словами, OpenID — это чистая аутентификация: вы знаете, кто к вам пришёл, но вольны делать с этим знанием всё, что угодно.

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

Аналогия. OpenID — это ваш паспорт: он говорит, кто вы, но что он даёт, зависит от места, куда вы с ним пришли. OAuth — ключи от вашей машины: с ними можно ездить на вашей машине, даже не зная, как вас зовут.

Вход на сайты

Исходя из написанного выше, естественной технологией для реализации входа на сайты с существующим сторонним аккаунтом является OpenID. Больше того, из-за неопределённости понятия токена "входа через OAuth" вообще не может существовать в природе. Тем не менее, вездесущие входы через Твиттер и Фейсбук используют как раз OAuth. Где неувязка?

И Твиттер, и Фейсбук используют OAuth, как деталь реализации, но в остальном у них нет ничего общего. Роли протоколов выглядят в этом случае так:

Аналогия. "Вход через OAuth" — это ключи от машины, в которой по случаю оказались ещё и именные документы владельца.

Важно понимать, что поскольку аутентификацию предоставляет проприетарный API, это не "вход через OAuth", а "вход через Твиттер/Фейсбук". На практике это значит, что нельзя написать некую обобщённую OAuth-библиотеку для входа через любой произвольный сервис типа Твиттера и Фейсбука.

Хотя…

OpenID Connect

Идея обобщённого входа через OAuth может работать, если вместо проприетарного API аутентификации стандартизовать какой-нибудь открытый. И такая попытка была — OpenID Connect. Там главная идея OpenID — открытая аутентификация — отделяется от протокола обмена ключами, в качестве которого берётся как раз OAuth. И ещё решаются сопутствующие вопросы типа discovery-механизма, которого в OAuth нет.

Впрочем, на практике OpenID Connect нигде не используется. Почему — совсем отдельная тема.

Комментарии: 19

  1. Владимир Епифанов

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

  2. Ivan Sagalaev

    Ну судьба вполне понятна: он медленно умирает. Но я специально не затрагивал этого здесь.

  3. Доброжелатель

    Непонятно, как же тогда расценивать http://github.com/intridea/omniauth - как парадокс?

  4. Ivan Sagalaev

    Никакого парадокса. Это не обобщённая библиотека, там вручную написан код для каждого провайдера.

  5. Foggy

    Хотелось бы ещё понять теперь, почему не используется OpenID Connect? Иван, может быть поделитесь ссылкой на какое-нибудь объяснение или лучше объясните в двух словах?

  6. Владимир Епифанов

    gurylyov, какие преимущества даст использование OpenID Connect? Твитер и Фейсбук дают ясные преимущества в виде доступа к разнообразной информации и под них всё уже готово.

  7. demiazz.py

    Спасибо за статью =) теперь все стало на свои места, что куда и почему.

  8. Константин Никитин

    Иван, спасибо огромное за статью! Сравнение OAuth от Facebook с машиной с забытым паспортом сразу все расставило по местам!

  9. Барсук ленивый

    Люди считают так, потому что для них и аутентификация с авторизацией одно и то же "Надо нажатьна кнопку, и тогда можно будет писать"

  10. Ivan Sagalaev

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

  11. seligoroff@gmail.com

    Кстати, Иван, вот мозилловцы решили пройтись по той же тропе. http://identity.mozilla.com/post/7616727542/introducing-browserid-a-better-way-to-sign-in

  12. Сергей

    «OpenID — это ваш паспорт»

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

    В общем, частному лицу надёжнее полагаться на крупного OpenID-провайдера, чем надеяться на «своё» доменное имя; «своих» постоянных URI в современном интернете нет :-(

    А если полагаться на крупного id-провайдера, то разница между механизмами аутентификации стирается (в любом случае, с авторизацией или без, всё в руках id-провайдера).

  13. Сергей

    «OpenID — это ваш паспорт ... OAuth — ключи от вашей машины ...»

    Сформулировал. OpenID — попытка построить замок из песка: сделать человеку постоянный идентификатор из по определению временного доменного имени. OAuth — это ключи от дома, в котором нет стен: ну так сложилось, что вместо стен обычно ширмочка, да и то не своя.

  14. aemayer

    Thanks for the post--really appreciate the info.

  15. Rohit Jangid

    great post, very clearly explained the difference between the two protocols which I was looking for.

  16. Зануда

    Я вот читал и думал, где же зде скрытое "сокровище" зарыто и понял, OAUTH не только предоставляет авторизацию, но ещё и подтверждает или, точнее, передаёт данные аутентификации от facebook'а или twitter'а. Потому сайт, через который была выполнена авторизация с помощью OAUTH, доверяя данным именно аутентификации может допустить вход пользователя к себе.

    Аналогия. "Вход через OAuth" — это ключи от машины, в которой по случаю оказались ещё и именные документы владельца.

    Собственно, ваша аналогия и молвит как раз о сем.

  17. SUMMARY

  18. Mike Schwartz

    OpenID is about authentication (ie. proving who you are), OAuth is about authorisation (ie. to grant access to functionality/data/etc.. without having to deal with the original authentication) Well thats another difference

  19. Владимир

    Спасибо за статью, не много, кто может толком объяснить разницу, а тут все ясно сразу стало

Добавить комментарий