Плагин авторизации через Вконтакте, Yandex, Google, Facebook и другие Open ID

Привет, я начинающий программист и решил встроить в свой сайт плагин авторизации Loginza.

Задача данного скрипта очень проста: авторизация через социальные сети и других провайдеров Open ID
image
image

Для начала нам понадобятся классы для работы с сервисом, которые можно скачать здесь
— LoginzaAPI.class.php
— LoginzaUserProfile.class.php
— JSON.php
Подключаем наши классы:

require_once 'libs/LoginzaAPI.class.php';
require_once 'libs/LoginzaUserProfile.class.php';

Создаем обьект для работы с Loginza API
$LoginzaAPI = new LoginzaAPI();

в

добавляем —

Код из архива

// проверка переданного токена
if (!empty($_POST['token'])) {
 // получаем профиль авторизованного пользователя
 $UserProfile = $LoginzaAPI->getAuthInfo($_POST['token']);
 
 // проверка на ошибки
 if (!empty($UserProfile->error_type)) {
 // есть ошибки, выводим их
 // в рабочем примере данные ошибки не следует выводить пользователю, так как они несут информационный характер только для разработчика
 echo $UserProfile->error_type.": ".$UserProfile->error_message;
 } elseif (empty($UserProfile)) {
 // прочие ошибки
 echo 'Temporary error.';
 } else {
 // ошибок нет запоминаем пользователя как авторизованного
 $_SESSION['loginza']['is_auth'] = 1;
 // запоминаем профиль пользователя в сессию или создаем локальную учетную запись пользователя в БД
 $_SESSION['loginza']['profile'] = $UserProfile;

Создаем обьект для работы с LoginzaProfile 
 $LoginzaProfile = new LoginzaUserProfile($_SESSION['loginza']['profile']);


Далее создадим локального пользователя, но перед этим проверим есть ли уже запись в нашей базе для этого в класс LoginzaUserProfile.class.php добавим следующие строчки

public function genEmail () { // получит email
 return $this->profile->email;
 }

public function genProvider () { // получит адрес провайдера, например <a href="http://vkontakte.ru">vkontakte.ru</a>
 return $this->profile->provider;
 }

public function genIdentity () { // получит адрес пользователя , например <a href="http://vkontakte.ru/login">vkontakte.ru/login</a>
 return $this->profile->identity;
 }

public function genDob () { // получит дату рождения пользователя
 return $this->profile->dob;
 }

public function genUID () { // получит уникальный id пользователя
 return $this->profile->uid;
 }
 
 public function genGender () { // получит пол пользователя
 return $this->profile->gender;
 }


Которые позволят нам получить уникальный id пользоваля в базе провайдера через которого идет авторизация.

теперь проверим по логину пользователя и uid есть ли он в нашей базе.
На всякий случай зашифруем uid по md5();

$finduser = "SELECT * FROM users WHERE login='".$LoginzaProfile->genNickname()."' AND password='".md5($LoginzaProfile->genUID())."' ";
$respu = mysql_query($finduser);
$r = @mysql_fetch_array($respu);

if($r['id'] == '') { //если id из нашей базы пустое, создаем новую запись
$newuser = mysql_query ("INSERT INTO users (login,password,avatar,email,name,bdate,website,openid) VALUES('".$LoginzaProfile->genNickname()."','".md5($LoginzaProfile->genUID())."','".$_SESSION['loginza']['profile']->photo."','".$LoginzaProfile->genEmail()."','".$LoginzaProfile->genFullName())."','".$LoginzaProfile->genDob()."','".$LoginzaProfile->genUserSite()."','".$LoginzaProfile->genProvider()."')"); }


где:
$LoginzaProfile->genNickname() — Ник на сайте через который проходит авторизация
md5($LoginzaProfile->genUID()) — Зашифрованный id пользователя
$_SESSION['loginza']['profile']->photo — Фотография пользователя
$LoginzaProfile->genEmail() — email указанный в профиле пользователя
$LoginzaProfile->genFullName()) — полное имя
$LoginzaProfile->genDob() — Дата рождения
$LoginzaProfile->genUserSite() — Web Site указанный в профиле пользователя
$LoginzaProfile->genProvider() — адрес провайдера, например vkontakte.ru ( это нам поможет отображать иконку пользователя, например в оставленных комметариях)

}
} elseif (isset($_GET['quit'])) {
 // выход пользователя
 unset($_SESSION['loginza']);
}

// проверка авторизации, вывод профиля если пользователь авторизован ранее
if (!empty($_SESSION['loginza']['is_auth'])) {
 
 // объект генерации недостаюих полей (если требуется)
 $LoginzaProfile = new LoginzaUserProfile($_SESSION['loginza']['profile']);

// пользователь уже прошел авторизацию
 $avatar = '';
 if (!empty($_SESSION['loginza']['profile']->photo)) {
 $avatar = '<img src="http://'.$_SESSION['loginza']['profile']->photo.'"/> ';
 }

echo "<h3>Приветствуем Вас:</h3>";

$favicon = '<img src="http://'.$LoginzaProfile->genProvider().'favicon.ico"/>';

echo $avatar . $favicon . $LoginzaProfile->genDisplayName().', Выход ('.$LoginzaProfile->genNickname().')';

$userpassword = $LoginzaProfile->genUID();
 
 // вывод данных полученных через LoginzaUserProfile
 echo "";
 echo "Ник: ".$LoginzaProfile->genNickname()."
";
 echo "Отображать как: ".$LoginzaProfile->genDisplayName()."
";
 echo "Полное имя: ".$LoginzaProfile->genFullName()."
";
 echo "Сайт: ".$LoginzaProfile->genUserSite()."
";
 echo "Email: ".$LoginzaProfile->genEmail()."
";
 echo "Провайдер: ".$LoginzaProfile->genProvider()."
";
 echo "Профиль: ".$LoginzaProfile->genIdentity()."
";
 echo "Дата Рождения: ".$LoginzaProfile->genDob()."
";
 echo "Пол: ".$LoginzaProfile->genGender()."
";
 echo "Выдуманный пароль равен uid пользователя в MD5: ".md5($userpassword)."
";
 echo "";
 
 // выводим переданные данные от Loginza API
 $LoginzaAPI->debugPrint($_SESSION['loginza']['profile']);
} else {
 // требуется авторизация, вывод ссылки на Loginza виджет
 echo "<h3>Блок авторизации:</h3>";
 echo 'Для авторизации нажмите ссылку';

// или вывод панели с иконками
echo '
<iframe src="http://loginza.ru/api/widget?overlay=loginza&token_url=[RETURN_URL]" 
style="width:359px;height:300px;" scrolling="no" frameborder="no">
';

}

Архив с рабочим примером можно скачать здесь.
Просмотреть пример здесь.
После установки на сервер, используйте дамп users.sql.


3 комментария

комментарий был удален
комментарий был удален
комментарий был удален
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.