OAuth
OAuth — открытый протокол авторизации, который позволяет предоставить третьей стороне ограниченный доступ к защищенным ресурсам пользователя без необходимости передавать ей (третьей стороне) логин и пароль. Например, пользователь, который хочет предоставить сервису социальной сети доступ к книге контактов своего почтового аккаунта, не должен сообщать сети свой пароль от почты. Вместо этого он проходит авторизацию непосредственно в почтовом сервисе, который (с разрешения пользователя или администратора сервиса) предоставляет сервису социальной сети полномочия доступа к адресной книге.
Содержание |
[править] История
[править] OAuth 1.0
OAuth возник в ноябре 2006 года, когда Блейн Кук (англ. Blaine Cook) разрабатывал реализацию протокола OpenID для сервиса микроблогов Twitter.[1] Совместно с Крисом Мессиной (англ. Chris Messina) он искал путь использовать OpenID для доступа к Twitter API без предоставления сервису пароля. В сотрудничестве с одним из создателей OpenID Девидом Рекордоном (англ. David Recordon) они провели анализ функциональности OpenID, а также проприетарных протоколов авторизации, таких как Flickr Auth, Google AuthSub и Yahoo! BBAuth, после чего пришли к заключению, что существует необходимость в новом открытом протоколе. В апреле 2007 года образовалась группа инженеров, работавших над его созданием. В её работе приняли участие сотрудники компаний Google и AOL (которая в это же время представила свой собственный протокол OpenAuth). Финальная версия ядра протокола OAuth 1.0 была представлена 4 декабря 2007 года. В 2008 году проводилась работа по стандартизации протокола в Инженерном совете Интернета.
15 апреля 2009 года Twitter предложил своим пользователям решение, позволяющее делегировать третьесторонним сайтам и сервисам доступ к своим аккаунтам. Оно было названо «Sign-in with Twitter» и было основано на OAuth. Это событие стало поводом для первого широкого исследования протокола на уязвимости, и через несколько дней был обнаружен потенциальный эксплоит, затрагивающий все существующие реализации OAuth. После этого, 23 апреля сообществом разработчиков было выпущено первое дополнение безопасности к протоколу, которое вошло в обновленную спецификацию OAuth Core 1.0 Revision A, опубликованную 24 июня. В апреле 2010 года был выпущен информационный документ RFC 5849[2], посвященный стандарту OAuth.
[править] OAuth 2.0
В 2010 году началась работа над соверешенно новой версией протокола OAuth 2.0[3], которая не будет обратно совместимой с OAuth 1.0. Предпосылок для создания OAuth 2.0 было несколько. В первую очередь, OAuth достаточно нетривиально использовать на клиентской строне. Одна из поставленных целей при разработке нового OAuth — упростить разработку клиентских приложений. Во-вторых, несмотря на заявленную в стандарте реализацию трех методов (называемых потоками — flows) получения токена (уникального идентификатора) для авторизации: для веб-приложений, настольных клиентов и мобильных клиентов, фактически все три способа слиты в один. И, в-третьих, протокол оказался плохо масштабируемым. В него планируется добавить[4]:
- 6 новых потоков.
- Токен на предъявителя.
- Метод авторизации аналогичен существующему способу авторизации с помощью cookie. В этом случае токен непосредственно используется как секрет (сам факт наличия токена авторизует клиента) и передается через HTTPS. Это позволяет получать доступ к API посредством простых скриптов (например, с использованием cURL).
- Упрощенная подпись.
- Короткоживущие токены с долговременной авторизацией.
- Вместо выдачи долгоживущего токена (который за длителное время может быть скомпрометирован), сервер предоставляет кратковременный доступ и долговременную возможность обновлять токен без участия пользователя.
- Разделение ролей.
- За авторизацию и за предоставление доступа к API могут отвечать разные сервера.
Стоит отметить, что, хотя стандарт OAuth 2.0 ещё не утвержден, он уже используется некоторыми сервисами. Например, Graph API социальной сети Facebook поддерживает только OAuth 2.0.
[править] Чем OAuth отличается от OpenID?
Существует ошибочное мнение, что OAuth является расширением протокола OpenID. На самом деле это не так. Хотя OpenID и OAuth имеют много общего, последний является самостоятельным протоколом, никак не связанным с OpenID.
OAuth является протоколом авторизации, который позволяет предоставить права на использование какого-то ресурса (например, API какого-либо сервиса). Наличие прав определяется токеном (уникальным идентификатором), который может быть одним и тем же для разных пользователей, или же у одного пользователя в разное время могут быть разные токены. Предоставление прав происходит в обмен на предоставление токена. В общем случае нельзя определить, кому принадлежит токен и кто в настоящий момент пользуется правами.
OpenID является средством аутентификации: с помощью этой системы можно удостовериться, что пользователь — именно тот, за кого себя выдает. Какие действия сможет совершать пользователь, прошедший аутентификацию посредством OpenID, определяется стороной, проводящей аутентификацию.
[править] Как работает OAuth
Поясним работу протокла OAuth на примере[2]. Допустим, что пользователь (владелец ресурсов) хочет распечатать свои фотографии (ресурсы), загруженные на сайт «photos.example.net» (сервер), при помощи сервиса печати «printer.example.net» (клиент).
- Клиент посредством протокола HTTPS отправляет серверу запрос, который содержит идентификатор клиента, метку времени, адрес обратного вызова по которому нужно вернуть токен, используемый тип цифровой подписи и саму подпись.
- Сервер подтверждает запрос и отвечает клиенту токеном доступа (Access Token) и частью разделенного секрета.
- Клиент передает токен владельцу ресурсов (пользователю) и перенаправляет его на сервер для прохождения авторизации.
- Сервер, получив от пользователя токен, запрашивает у него его логин и пароль, и в случае успешной аутентификации просит пользователя подтвердить доступ клиента к ресурсам (авторизация), после чего пользователь перенаправляется сервером к клиенту.
- Клиент передает серверу токен посредством протокола TLS и запрашивает доступ к ресурсам.
- Сервер подтверждает запрос и отвечает клиенту новым токеном доступа.
- Используя новый токен, клиент обращается к серверу за ресурсами.
- Сервер подтверждает запрос и предоставляет ресурсы.
Данный пример описывает поток с кодом подтверждения (Authorization Code Flow). Помимо этого в стандарте OAuth 2.0 описаны следующие потоки:
- Поток неявного доступа (Implicit Grant Flow)
- Отличие от потока с кодом подтверждения заключается в том, что клиент не проходит аутентификацию на сервере и токен доступа выдается сервером после запроса авторизации.
- Поток с обновляемым токеном (Refreshing an Expired Access Token Flow)
- Отличия данного потока от приведенного примера в следующем: на шаге 2 сервер помимо токена доступа, который имеет ограниченное время жизни, выдает токен обновления; на шаге 8 сервер проверяет, является ли токен доступа валидным (в смысле истичения времени жизни), и в зависимости от этого либо предоставляет доступ к ресурсам, либо требует обновления токена доступа (который предоставляется при предъявлении токена обновления).
- Поток с предоставлением клиенту пароля (Resource Owner Password Credentials Flow)
- В этом потоке владелец ресурсов предоставляет клиенту логин и пароль, он передает их серверу и получает токен для доступа к ресурсам. Не смотря на то, что такой режим работы несколько противоречит концепции создания протокола, он описан в спецификации.
- Поток клиентских полномочий (Client Credentials Flow)
- В данном режиме работы протокола предоставление сервером токена доступа происходит после передачи клиентом его пользователя и пароля, который был предварительно установлен сервером авторизации (в спецификации не оговорено, каким именно образом). Фактически, клиент сразу проходит как авторизацию, так и аутентификацию.
OAuth поддерживает два метода аутентификации сообщений от клиента: HMAC-SHA1 и RSA-SHA1. Есть возможность передавать сообщения без подписи, тогда в поле типа подписи указывается «plain text». Но в этом случае, согласно спецификации, соединение между клиентом и сервером должно устанавливаться через протокол SSL или TLS.
[править] Порталы, использующие OAuth
- Yahoo в начале 2008 года объявила о комплексной поддержке OAuth в Yahoo Fire Eagle API.
- Twitter — с апреля 2009 года.
- Яндекс — с сентября 2010 года доступен в проектах Я.ру, Яндекс.Фотки, Яндекс.Директ, Яндекс.Подписки, Яндекс.Метрика и Яндекс.Почта для домена[5].
- Mail.ru — с февраля 2011 года авторизация в Mail.Ru API переведена на стандарт OAuth 2.0[6].
- Microsoft летом 2011 года объявил о поддержке OAuth 2.0 для всех основных сервисов Windows Live (более 500 миллионов активных пользователей), включая Windows Live ID, Hotmail (календарь, контакты), SkyDrive (CRUD-доступ к документам, фотографиям, аудио и видео-файлам, в бета-версии), Messenger (присутствие, статус и XMPP-протокол).
- Flickr — c июня 2011 года[7].
- Facebook — с сентября 2011 года.
- Google[8]
- FriendFeed
- Dropbox
- ВКонтакте
- LiveJournal
- Одноклассники.ru
[править] Примечания
[править] См. также
[править] Ссылки
|
|
|
|---|---|
| С симметричными алгоритмами | |
| С симметричными и асимметричными алгоритмами | |
| Протоколы и сервисы, используемые в Internet |
OAuth • OpenID • Windows Live ID |