OpenID – универсальность авторизации

Регистрация пользователей давно стала рутинной операцией для многих и многих интернет-сервисов, будь то форумы, блоги или новостные сайты. Зарегистрированные пользователи получают доступ к дополнительным функциям сервиса. Активный интернет-путешественник регулярно использует десятки сайтов. И для каждого нужен свой пароль, своё имя пользователя — это не очень удобно. Добавить пользовательского удобства регистрации призвана технология OpenID. Попробуем разобраться, что это за технология и как она работает.

OpenID позволяет Интернет-пользователю единым образом авторизовываться на множестве интернет-сервисов (веб-сайтов). Конечно, эти  сервисы должны поддерживать OpenID. При этом уникальность пользовательских идентификаторов (имен пользователей, логинов) обеспечивается  использованием в качестве их основы URL (интернет-адресов).

(Важно отметить, что для авторизации в OpenID может использоваться не только «простой» URL, но и другие способы адресации ресурсов в Интернете, например XRI. Для упрощения изложения, далее в этой статье речь будет идти только об URL, тем более, что пониманию принципов работы OpenID это упрощение не помешает.)

Если при использовании «классической» системы авторизации пользователь вводит в форму на сайте пару из идентификатора (логина) и соответствующего ему пароля, то в случае OpenID используется всего один объект - контролируемый пользователем URL.  Например, пользователю достаточно ввести адрес своей персональной страницы — http://test.ru/mypage/.

Такая, на первый взгляд «куцая», система авторизации работает благодаря автоматизированным механизмам, позволяющим авторизующему серверу выяснить, что пользователь действительно контролирует заявленный URL. То есть обладателю аккаунта OpenID не нужно регистрироваться на каждом (требующем регистрации) сайте, а достаточно лишь указать свой интернет-идентификатор - дальнейший процесс авторизации и регистрации происходит автоматически, в прозрачном для пользователя режиме. В качестве дополнительного «канала связи» используется браузер.

Технология OpenID предложена в 2005 году Бредом Фицпатриком, создавшим один из первых блог-хостингов (сервис LiveJournal). Несмотря на технические и организационные трудности, задерживавшие развитие технологии, сейчас доступна уже вторая версия протокола OpenID 2.0. При этом OpenID получил поддержку крупных игроков рынка «социальных сервисов», среди которых Google (http://www.blogger.com), Yahoo (http://openid.yahoo.com/), VeriSign (https://pip.verisignlabs.com/).

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

Получить удостоверение

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

Сейчас доступны самые разнообразные варианты получения «удостоверения» OpenID. Например, зарегистрировав блог на сервисе LiveJournal.com, пользователь автоматически получает возможность указывать URL своего блога в качестве идентификатора OpenID - достоверность идентификатора, в таком случае, может подтвердить OpenID-сервер LiveJournal.com. Упомянутый выше сервис VeriSign предлагает пользователю указать свои персональные данные, после чего за ним закрепляется персональный URL (указывающий на сервис VeriSign), который далее используется в качестве пользовательского идентификатора OpenID.

Другой вариант — организация собственного сервера OpenID. Доступно несколько бесплатных решений с открытым кодом, позволяющих реализовать как простой «однопользовательский» OpenID-сервер (например, PHPMyID) на виртуальном хостинге, так и полноценный многопользовательский сервер, являющийся мощным OpenID-провайдером (доступен большой набор библиотек для различных платформ: http://wiki.openid.net/Libraries ).

Предъявитель сего действительно является...

С точки зрения сайтостроения, у OpenID есть две стороны. Одну из них, пользовательскую, мы сейчас рассмотрели. Вторая — это организация «приёма» авторизационной информации на стороне веб-сайта. То есть для того, чтобы авторизация по OpenID заработала на веб-сайте, придётся установить дополнительные модули, поддерживающие эту технологию.  Поддержка OpenID — это не функция веб-сервера, а забота CMS - системы управления контентом.

Популярность, которую уже обрел OpenID, способствует тому, что в некоторых современных CMS модуль поддержки OpenID входит в «стандартную комплектацию». Например, бесплатная CMS Drupal содержит готовый модуль OpenID в базовом наборе модулей. В других CMS функции OpenID доступны в виде расширений («плагинов»), созданных сторонними разработчиками.

Важно отметить ещё один момент, напрямую касающийся внедрения поддержки OpenID на веб-сайте: авторизация пользователей по «OpenID-удостоверениям» других сервисов и выдача «OpenID-удостоверений» пользователям так, чтобы они могли регистрироваться на других сайтах, это две совершенно разных задачи в рамках технологии OpenID. Первая задача — задача авторизации; вторая — создания провайдера OpenID. Для решения этих задач требуются различные программные модули. При этом, очевидно, для большинства сайтов достаточно функции по «приёму» авторизаций, то есть модуля, позволяющего пользователям авторизоваться с помощью имеющихся у них аккаунтов OpenID. Например, пользователь блог-хостинга Google Blogspot сможет оставлять комментарии на сайте, указывая в качестве авторизационной информации свой адрес блога.

Доверительный разговор

Технология OpenID позволяет передавать в качестве информации о пользователе не только идентификатор этого пользователя (как мы разобрались, таким идентификатором служит URL), но и ряд других данных. Например, полное имя и фамилию пользователя, сетевой псевдоним пользователя, адрес e-mail и др. Это добавляет системе гибкости, но и поднимает вопрос о доверии веб-сервисов, использующих OpenID для авторизации «внешних» пользователей, к удостоверяющим «подлинность» этих пользователей провайдерам OpenID.

Важной особенностью OpenID с точки зрения базовых концепций безопасности в Интернете является то, что эта технология не предусматривает каких-то механизмов строгого удостоверения сообщений  (или другого контента), переданных под тем или иным идентификатором OpenID. Грубо говоря, в OpenID пока что отсутствует механизм электронной подписи, что позволяет администратору веб-сайта размещать на нём некоторые сообщения, имитируя работу OpenID. Такие сообщения могут оформляться администратором сайта (имеющим полный контроль над контентом этого сайта) как оставленные авторизованным по OpenID владельцем того или иного URL. При этом читатель не имеет возможности как-то проверить подлинность авторства сообщений и для него подделанные сообщения будут неотличимы от реальных, оставленных легитимным владельцем «OpenID-удостоверения».

Другим проблемным моментом является то, что процесс авторизации пользователя в OpenID требует принудительного перенаправления пользовательского браузера на адрес удостоверяющего сервера. Такая особенность может быть использована фишерами: сайт злоумышленников, имитирующий авторизацию по OpenID, способен перенаправлять браузер на подставной сервер, где пользователю будет предложено ввести пароль и логин от реального аккаунта OpenID. При этом такая ситуация может даже не насторожить пользователя, ведь пароль и логин могут потребоваться и в «штатном режиме» работы OpenID, например в случае ошибки автоматической «браузерной авторизации». В результате, в руках у злоумышленников окажутся реквизиты доступа к аккаунту OpenID.

Во всех описанных случаях на первое место выходит доверие участвующих в процессе авторизации сторон к удостоверяющему OpenID-серверу. А многие возможные атаки могут быть предотвращены с использованием SSL для обработки запросов авторизации.

OpenID удостоверяет не физическое лицо, а лишь связь некоторых авторизационных данных интернет-пользователя с данным OpenID-идентификатором (URL). То есть OpenID не отменяет анонимности: при регистрации на OpenID-сервере пользователь может не вводить персональных данных или ввести неверные данные. Также, OpenID позволяет одному физическому лицу иметь несколько «интернет-лиц», каждое из которых будет связано со своим URL. Также в OpenID имеются механизмы, позволяющие реализовать более строгое управление персональными данными: в этом случае пользователь самостоятельно контролирует то, какие данные о нём передаются тому или иному «внешнему» серверу.

Принцип действия в деталях

Итак, OpenID — это достаточно универсальный и удобный для пользователя механизм авторизации на различных веб-сервисах и сайтах. Разберем более детально принципы работы этого механизма.

Термины:

«Сайт» - веб-сайт, требующий авторизации по протоколу OpenID.

«Пользователь» - интернет-пользователь, имеющий аккаунт OpenID.

«Идентификатор OpenID» - URL, используемый Пользователем в качестве своего универсального интернет-идентификатора, владение которым и подтверждается с помощью OpenID.

«OpenID-сервер» - сервер, удостоверяющий идентификатор OpenID Пользователя по запросам третьей стороны; на этом сервере размещён аккаунт OpenID Пользователя, и этот сервер имеет доступ к персональной информации Пользователя.

Процесс

1. На требующем авторизации Сайте Пользователь указывает в специальном поле ввода свой Идентификатор OpenID.

2. Программное обеспечение OpenID Сайта на основании введённого Идентификатора OpenID производит поиск адреса OpenID-сервера, соответствующего идентификатору. Для определения адреса используется три различных протокола, каждый из которых основан на запросе документов с сервера, расположенного под URL, соответствующему Идентификатору OpenID. Таким образом, выбор OpenID сервера определяется документами, расположенными  под тем URL, о владении которым заявляет Пользователь.

3. Если адрес OpenID-сервера успешно определён, программное обеспечение Сайта устанавливает с OpenID-сервером соединение, при этом вторая версия протокола строго рекомендует защищать это соединение криптографическими методами.

4. В случае успешного создания «прямого сеанса связи» с OpenID-сервером, программное обеспечение Сайта посылает авторизационный запрос для Идентификатора OpenID OpenID-серверу через клиентский браузер Пользователя.

5. С помощью серии перенаправлений браузер Пользователя (в прозрачном для пользователя  режиме) авторизуется на OpenID-сервере, используя Индетификатор OpenID и данные, идентифицирующие Сайт, на котором происходит авторизация. Авторизация пользователя на сервере OpenID может присходить различными способами, определяемыми администратором сервера. На данном шаге от пользователя может потребоваться ввод логина и пароля или подтверждение доверия запрашивающему авторизацию сайту. Однако этот процесс может быть полностью автоматизирован, например с помощью авторизации пользователя на основе браузерных «файлов куки».

6. Если процесс авторизации пользователя OpenID-сервером завершился успешно, исходному Сайту через браузер Пользователя возвращается «положительный ответ» OpenID-сервера, на основании которого программное обеспечение Сайта может авторизовать или зарегистрировать Пользователя «у себя». В случае, если пользователь не был авторизован или возникли другие ошибки, Сайту возвращается «отрицательный ответ», содержащий, в том числе, информацию об ошибке.