Рейтинг@Mail.ru
загрузкаидет загрузка

Loginza — облегчаем работу с OpenID/oAuth/OpenAPI

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

loginza-1.gif (12.89 Kb)


Затем появился oAuth, совершенно другой по замыслу протокол авторизации, а точнее служащий для доступа к некоторому API без ввода пароля. Но зачастую сайты поддерживающие oAuth не поддерживают OpenID, напрмер Twitter. Отдельно отличился популярный ВКонтакте, разработавший свой велосипед OpenAPI.

В результате получается, что для поддержки всех популярных сайтов приходится вникать в нюансы работы аж трех протоколов, использовать совершенно разные библиотеки, зачастую довольно сложные.

Облегчить программисту внедрение аутентификации пользователя призван отечественный сервис - Loginza. Который, кстати, сегодня купил Яндекс! Так что можно переставать думать о его дальнейшей перспективе - она будет радужной.

Лучше конечно почитать API на сайте Логинзы, мало ли что там изменится позже. Но вкратце сейчас все работает так:

Сначала подключаем JavaScript виджет на нужную страницу, например стандартную страницу авторизации.
<script src="http://s1.loginza.ru/js/widget.js" type="text/javascript"></script>
<a href="https://loginza.ru/api/widget?token_url=[RETURN_URL]" class="loginza">Войти через OpenID</a>

loginza-2.png (37 Kb)


При нажатии на эту ссылочку открывается окно с набором провайдеров для авторизации. Набор можно задавать самому через параметр providers_set. То есть не обязательно выводить все N провайдеров, а можно обойтись самыми популярными Twitter, Facebook, VKontakte, Yandex, Google и оставить кастомный OpenID для гиков :) Виджет к слову мультиязычный, язык передается в параметре lang вместе с token_url.

Loginza перенаправляет юзера на сайт провайдера выбранной учетной записи, он подтверждает/не подтверждает что он это он и далее опять виджет обрабатывает ответы провайдера, перенаправляя пользователя на [RETURN_URL] (нужно указать полный URL-адрес с http:// или https://, предварительно кодированный, например PHP функцией urlencode() )

loginza-3.png (19.64 Kb)


[RETURN_URL] это фактически путь к скрипту-обработчику, который возьмет значение token'a из POST запроса. Token это уникальный идентификатор ячейки хранения результата авторизации на сервере Логинзы.

Далее мы делаем еще один запрос к Логинзе, используя полученный token: http://loginza.ru/api/authinfo?token=[TOKEN_KEY_VALUE]

В ответ на запрос проверки token, Loginza.API возвращает ответ в формате JSON содержащий все данные профиля пользователя, которые отдал провайдер, или ошибку (если такая возникла в ходе авторизации).

Например:

{"error_type":"token_validation","error_message":"Empty token value."}
или

{"identity":"http:\/\/admin.loginza.ru\/","provider":"http:\/\/loginza.ru\/server\/",

"name":{"full_name":"\u0421\u0435\u0440\u0433\u0435\u0439 \u0421\u0435\u0440\u0433\u0435\u0439"},

"nickname":"admin","email":"admin@loginza.ru","gender":"M","dob":"1985-01-31"}

На основе полученного ответа мы уже сами решаем, что делать: зарегистрировать нового пользователя или авторизовать, если он у нас уже есть в базе данных с таким идентификатором. Красота.


Ooooops

Looks like Twitter's feed isn't working at the moment.