Как ни странно, путаница в понятиях "OpenID" и "OAuth" встречается довольно часто. Люди используют их как взаимозаменяемые термины или считают OAuth своего рода новой улучшенной версией OpenID. Но на самом деле это совершенно разные вещи. Чтобы было куда ссылаться в таких случаях, пишу пост.
Этот пост не о том, что из этих двух слов "лучше", что "зло" или что "умерло". Это просто констатация фактов.
Суть
OpenID позволяет сайту удостовериться, что его пользователь владеет неким персональным URL (своим сайтом, блогом, профилем). Этого факта достаточно для того, чтобы использовать уникальный URL для узнавания того же самого пользователя в следующий раз. И всё. Все остальные вещи — заведение аккаунта, получение email'а и других данных, разрешение какой-то активности на сайте — остаётся на усмотрение сайта. Другими словами, OpenID — это чистая аутентификация: вы знаете, кто к вам пришёл, но вольны делать с этим знанием всё, что угодно.
OAuth позволяет программе (на вебе или локальной) получить от пользователя права на использование какого-то конкретного API. Права обозначаются токеном, свойства которого никак не определены: он может быть одинаковым для разных пользователей, может быть разным для одного в разное время. Всё, что гарантируется — это что программа в обмен на токен сможет выполнять какие-то действия на каком-то сервисе. Другими словами, OAuth — это чистая авторизация: вы обладаете конкретными правами, но не можете в общем случае по ним определить, кому они принадлежат.
Аналогия. OpenID — это ваш паспорт: он говорит, кто вы, но что он даёт, зависит от места, куда вы с ним пришли. OAuth — ключи от вашей машины: с ними можно ездить на вашей машине, даже не зная, как вас зовут.
Вход на сайты
Исходя из написанного выше, естественной технологией для реализации входа на сайты с существующим сторонним аккаунтом является OpenID. Больше того, из-за неопределённости понятия токена "входа через OAuth" вообще не может существовать в природе. Тем не менее, вездесущие входы через Твиттер и Фейсбук используют как раз OAuth. Где неувязка?
И Твиттер, и Фейсбук используют OAuth, как деталь реализации, но в остальном у них нет ничего общего. Роли протоколов выглядят в этом случае так:
- OAuth предоставляет сайту авторизацию на использование API Твиттера/Фейсбука
- а вот уже через API можно провести аутентификацию ("вход") пользователя, так как оба они предоставляют некую идентифицирующую информацию
Аналогия. "Вход через OAuth" — это ключи от машины, в которой по случаю оказались ещё и именные документы владельца.
Важно понимать, что поскольку аутентификацию предоставляет проприетарный API, это не "вход через OAuth", а "вход через Твиттер/Фейсбук". На практике это значит, что нельзя написать некую обобщённую OAuth-библиотеку для входа через любой произвольный сервис типа Твиттера и Фейсбука.
Хотя…
OpenID Connect
Идея обобщённого входа через OAuth может работать, если вместо проприетарного API аутентификации стандартизовать какой-нибудь открытый. И такая попытка была — OpenID Connect. Там главная идея OpenID — открытая аутентификация — отделяется от протокола обмена ключами, в качестве которого берётся как раз OAuth. И ещё решаются сопутствующие вопросы типа discovery-механизма, которого в OAuth нет.
Впрочем, на практике OpenID Connect нигде не используется. Почему — совсем отдельная тема.
Комментарии: 19
Мне не очень понятна судьба OpenID на фоне Твитера и Фейсбука, которые дают доступ к гораздо большему массиву информации о пользователе и его связях.
Ну судьба вполне понятна: он медленно умирает. Но я специально не затрагивал этого здесь.
Непонятно, как же тогда расценивать http://github.com/intridea/omniauth - как парадокс?
Никакого парадокса. Это не обобщённая библиотека, там вручную написан код для каждого провайдера.
Хотелось бы ещё понять теперь, почему не используется OpenID Connect? Иван, может быть поделитесь ссылкой на какое-нибудь объяснение или лучше объясните в двух словах?
gurylyov, какие преимущества даст использование OpenID Connect? Твитер и Фейсбук дают ясные преимущества в виде доступа к разнообразной информации и под них всё уже готово.
Спасибо за статью =) теперь все стало на свои места, что куда и почему.
Иван, спасибо огромное за статью! Сравнение OAuth от Facebook с машиной с забытым паспортом сразу все расставило по местам!
Люди считают так, потому что для них и аутентификация с авторизацией одно и то же "Надо нажатьна кнопку, и тогда можно будет писать"
Вы о каких "людях"? Я пишу о специалистах (разработчиках, менеджерах), а не о пользователях, которым про эти технологии в принципе и знать не нужно.
Кстати, Иван, вот мозилловцы решили пройтись по той же тропе. http://identity.mozilla.com/post/7616727542/introducing-browserid-a-better-way-to-sign-in
Только спустя некоторое время тот же паспорт может оказаться совсем не ваш, потому что нет возможности получить какое-либо доменное имя навсегда. Достаточно не суметь вовремя продлить домен. Достаточно, чтобы у какой-нибудь конторы оказалась подходящая торговая марка, чтобы домен можно было отобрать. Что примечательно, новый владелец паспорта сможет вклеить новую фотографию и претендовать на все права прежнего владельца. Например, сможет продать машину вместе с ключами.
В общем, частному лицу надёжнее полагаться на крупного OpenID-провайдера, чем надеяться на «своё» доменное имя; «своих» постоянных URI в современном интернете нет :-(
А если полагаться на крупного id-провайдера, то разница между механизмами аутентификации стирается (в любом случае, с авторизацией или без, всё в руках id-провайдера).
Сформулировал. OpenID — попытка построить замок из песка: сделать человеку постоянный идентификатор из по определению временного доменного имени. OAuth — это ключи от дома, в котором нет стен: ну так сложилось, что вместо стен обычно ширмочка, да и то не своя.
Thanks for the post--really appreciate the info.
great post, very clearly explained the difference between the two protocols which I was looking for.
Я вот читал и думал, где же зде скрытое "сокровище" зарыто и понял, OAUTH не только предоставляет авторизацию, но ещё и подтверждает или, точнее, передаёт данные аутентификации от facebook'а или twitter'а. Потому сайт, через который была выполнена авторизация с помощью OAUTH, доверяя данным именно аутентификации может допустить вход пользователя к себе.
Собственно, ваша аналогия и молвит как раз о сем.
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
Спасибо за статью, не много, кто может толком объяснить разницу, а тут все ясно сразу стало