xandeadx.ru Блог музицирующего веб-девелопера

PHP → Авторизация с помощью сервиса Loginza

Опубликовано в

Описание сервиса

Loginza — это сервис, который работает как мостик между вашим сайтом и множеством сторонних OpenID и OAuth провайдеров. Другими словами, сервис позволяет авторизоваться на вашем сайте с помощью аккаунтов Вконтакте, Яндекс, Google, Twitter и многих других.

Форма входа с помощью сервиса Loginza

Процесс авторизации с помощью Loginza

  1. Пользователь нажимает ссылку Войти с помощь, после чего открывается форма выбора OpenID провайдера, как на картинке выше.
  2. Пользователь выбирает провайдера, с помощью которого он хочет авторизоваться.
  3. Пользователь нажимает кнопку Продолжить и попадает на страницу провайдера (если он делает это в первый раз) где он должен разрешить передавать свои данные сайту.
  4. Сервис Loginza получает личные данные, заносит их в свою базу и редиректит пользователя на страницу указанную в token_url (об этом ниже).
  5. Скрипт, указанный в token_url, запрашивает данные с сервера Loginza и по ним авторизует пользователя.

Подключение виджета к сайту

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

<script src="http://loginza.ru/js/widget.js" type="text/javascript"></script>
<a href="http://loginza.ru/api/widget?token_url=<?php echo urlencode('http://example.com/loginza.php'); ?>" class="loginza">Войти с помощью ...</a>

В параметре token_url нужно передать абсолютный путь к скрипту, который будет проводить авторизацию. Класс у ссылки должен быть loginza.

Во вторых, создать скрипт, указанный в token_url (в примере это loginza.php), c примерным содержанием:

if (!isset($_POST['token']))
{
    die('Ошибка: Отсутствует токен');
}
 
// получаем данные о пользователе с сервера Loginza
$loginzaUserInfo = file_get_contents('http://loginza.ru/api/authinfo?token=' . $_POST['token']);
// декодируем данные, так как они приходят в json формате
$loginzaUserInfo = json_decode($loginzaUserInfo);
 
if (!isset($loginzaUserInfo->identity))
{
    die('Ошибка: ' . $loginzaUserInfo->error_message);
}
 
// 1. ищем в базе пользователя по уникальному идентификатору $loginzaUserInfo->identity
// 2. если его нет, то создаём нового пользователя
// 3. авторизуем пользователя
// 4. редиректим на главную страницу или на профиль

Вот и всё.

Объект $loginzaUserInfo, в зависимости от выбранного провайдера, может содержать различные свойства, например у Google это:

stdClass Object
(
    [identity] => https://www.google.com/accounts/o8/id?id=UfjloYgsddsfllIksdfsdflbgw
    [provider] => https://www.google.com/accounts/o8/ud
    [name] => stdClass Object
        (
            [first_name] => Василий
            [last_name] => Тараканов
            [full_name] => Василий
        )
 
    [email] => vasili@gmail.com
    [language] => ru
    [address] => stdClass Object
        (
            [home] => stdClass Object
                (
                    [country] => RU
                )
 
        )
 
    [uid] => 32445456546456
    [photo] => http://www.google.com/ig/c/photos/public/AIbEiAIAAABDCL2p
)

а у Twitter:

stdClass Object
(
    [identity] => http://twitter.com/vasili
    [provider] => http://twitter.com/
    [nickname] => vasili
    [web] => stdClass Object
        (
            [default] => http://vasili.com
        )
 
    [name] => stdClass Object
        (
            [full_name] => vasili
        )
 
    [photo] => http://a2.twimg.com/profile_images/654897/a_772341f_normal.jpg
    [uid] => 56465789
)

Как видно Twiiter не передаёт e-mail и адрес, зато передаёт ник. Обязательными здесь являются только identity и provider. Это нужно учесть при добавлении пользователя в базу.

Похожие записи

Комментарии RSS

Спасиб огромное. нечто подобно недавно искал. оч помог

Самое интересное с авторизацией то и не написали.

А так летом натыкался на модуль для логинзы (где авторизации толком и нет):
http://docs.drupal.ru/node/45330

Самое интересное с авторизацией то и не написали.

ну в простейшем случае это установка кукиса с идентификатором пользователя, ничего интересного тут нет :) всё зависит от внутреннего механизма движка (cms). тема слишком размытая чтобы на ней останавливаться

А кто все пароли от этих сервисо хнанит ? :)

Сервис Loginza получает личные данные, заносит их в свою базу и редиректит пользователя на страницу

Кроме пользователя еще и этот сервис будет знать мои данные ?

А кто все пароли от этих сервисо хнанит ? :)

достаточно пароля от одного OpenID провайдера (и то, только в том случае если вы на нём не авторизованы), хранит их разумеется пользователь. это гораздо удобнее чем на каждый сайт придумывать новый логин/пароль и заполнять горы анкет при регистрации.

Кроме пользователя еще и этот сервис будет знать мои данные ?

OpenID открытый протокол, не хотите светить свои данные — просто не заполняйте их в своём профиле. Хотя такие провайдеры как myopenid.com дают возможность создать несколько профилей под одним аккаунтом, и выбирать любой при авторизации.

Большое спасибо! Облазил кучу сайтов, ничего толкового небыло... тут с первого раза заработало !

А вы с uLogin это сравнивали? Что лучше?

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании