Авторизация через соц. сеть ВКонтакте


Для начала нам необходимо создать новое приложение на сайте социальной сети. Для этого переходим по ссылке:
http://vk.com/editapp?act=create
В открывшейся форме введите название приложения, например «Авторизация вконтакте». выберите тип приложения – «Веб-сайт». В поле «Адрес сайта» введите адрес вашего сайта, точнее страницы, куда будет перенаправляться пользователь после авторизации. В нашем случает это страница autor.php, то есть адрес сайта будет выглядеть так:
http://site.ru/autor.php
В поле «Базовый домен» укажите домен вашего сайта.
После нажатия на кнопку «Подключить сайт» и ввода проверочного кода вам должна открыться следующая форма с настройками приложения.
Из данной формы нам понадобятся такие данные, как "ID приложения", "Защищённый ключ", "Адрес сайта". Запишем их в специальные переменные в файле авторизации.

<?
$vk_client_id = ''; // ID приложения
$vk_client_secret = ''; // Защищённый ключ
$vk_redirect_uri = 'http://site.ru/autor.php'; // Адрес сайта
?>

Теперь переходим непосредственно к скрипту. У нас за авторизацию на сайте будет отвечать файл autor.php. В самом верху этого файла пропишите три вышеуказанных переменных (можно вынести их в отдельный файл настроек). Далее создадим ссылки на авторизацию через социальную сеть. Как правило их делаю под основной формой авторизации.

<?
echo "Авторизация через социальные сети<br/><br/>";
$vk_url = 'http://oauth.vk.com/authorize';

// это адрес, где будет обработан наш запрос на вториазцию
$params = array(
'client_id' => $vk_client_id,
'redirect_uri' => $vk_redirect_uri,
'response_type' => 'code',
'state' => 'vk'
);

// ID клиента и адрес, на который будет совершен редирект в случае удачной авторизации. Параметр state указывает идентификатор соц. сети в случае, если у вас будет несколько разных авторизаций (facebook, одноклассники и т.п.).

echo $link = '<a href="' . $vk_url . '?' . urldecode(http_build_query($params)) . '&scope=email"><img src=socauth_vk.png border=0></a> ';

// тут непосредственно выводим ссылку на авторизацию. В качестве картики socauth_vk.png можете использовать значок контакта.
?>

Теперь напишем скрипт-обработчик. Его надо размещать в коде скрипта выше проверки, которую делаю ваш основной скрипт на то авторизирован пользователь или нет.

<?
if (isset($_GET['code']) and $_GET['state'] == 'vk') {

// если к нам пришла в адресной строке переменная code и идентификатор социальной сети «state», который мы сформировали в ссылке авторизации имеет значение “vk”, то выполняем проверку авторизации

$vk_url = 'http://oauth.vk.com/authorize';
$params = array(
'client_id' => $vk_client_id,
'redirect_uri' => $vk_redirect_uri,
'response_type' => 'code'
);
$result = false;
$params = array(
'client_id' => $vk_client_id,
'client_secret' => $vk_client_secret,
'code' => $_GET['code'],
'redirect_uri' => $vk_redirect_uri
);
$token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);
if (isset($token['access_token'])) {
$params = array(
'uids' => $token['user_id'],
'email' => $token['email'],
'fields' => 'uid,first_name,last_name,email,screen_name,sex,bdate,photo_big',
'access_token' => $token['access_token']
);

// здесь мы передаем необходимые нам параметры. В данном случае передается ID пользователь вконтакте - user_id, email пользователя – email, а также ряд дополнительных параметров – ммя, фамилия, пол, дата рождения, аватарка и т.п. С полным списком параметров, которые можно получить из соц. сети можно посмотреть на сайте вконтакте в разделе для разработчиков.

$userInfo = json_decode(file_get_contents('https://api.vk.com/method/users.get' . '?' . urldecode(http_build_query($params))), true);
if (isset($userInfo['response'][0]['uid'])) {
$userInfo = $userInfo['response'][0];
$result = true;
}
}

if ($result) {
$socialemail=$token['email'];
$socialID=$userInfo['uid'];
$socialname=$userInfo['first_name'];
$socialname2=$userInfo['last_name'];

// произвольным переменным присваиваем значение переданных данных (email, ID пользователя, имя, фамилия)

$socialname=iconv('utf-8','windows-1251',$socialname);
$socialname2=iconv('utf-8','windows-1251',$socialname2);

// конвертируем параметры в кодировку windows-1251, если ваш скрипт в этой кодировке.

if ($socialemail == '') {$socialemail=$socialID;}

// Некоторые социальные сети запрещают передавать email через API. Поэтому, если у вас в качестве логина используется email, то переменной email присваиваем значение из переменной ID пользователя.

//echo "Социальный ID пользователя: " . $userInfo['uid'] . '<br />';
//echo "Email: " . $socialemail . '<br />';
//echo "Имя: $socialname";
// можно вывести пользователю полученные значения. В трех строчках выше, если их раскоментировать должно отобразиться после удачной авторизации три значения: ID пользователья в соц. сети, Email, Имя.

// далее проверям есть ли пользователь в базе данных. В нашем случае имя таблицы для авторизации $autortable и авторизация осуществляется по email и паролю. Если пользователя нет в базе, то добавляем его туда, а если есть, то заносим в сессию для авторизации.

$result_soctop = @mysql_query("SELECT * FROM $autortable WHERE email = '$socialemail'");
if (@mysql_num_rows($result_soctop) == 0)
{ // если пользователя с таким email нет в базе, то добавляем его в базу данных.
srand((double)microtime()*1000000);
$code_soc=md5(uniqid(rand()));
$code_soc=@substr($code_soc,1,12);

// генерируем пароль для пользователя
$result_top1=mysql_query("insert into $autortable (email,date,pass,ip,status,lastvisit,name) values ('$socialemail',now(),'$code_soc','','ok',now(),'$socialname $socialname2')");

// заносим пользователя в базу данных
$resultaut1 = @mysql_query("SELECT ID,email,pass FROM $autortable WHERE email='$socialemail'");
while ($myrow=mysql_fetch_array($resultaut1)) {
$_SESSION['sid']=$myrow["ID"];
$_SESSION['slogin']=$myrow["email"];
$_SESSION['spass']=$myrow["pass"];
//
$sid=$myrow["ID"];
$slogin=$myrow["email"];
$spass=$myrow["pass"];
}
} // нет пользователя

if (@mysql_num_rows($result_soctop) != 0)
{ // есть пользователь
$resultaut1 = @mysql_query("SELECT ID,email,pass FROM $autortable WHERE email='$socialemail'");
while ($myrow=mysql_fetch_array($resultaut1)) {
$_SESSION['sid']=$myrow["ID"];
$_SESSION['slogin']=$myrow["email"];
$_SESSION['spass']=$myrow["pass"];
$sid=$myrow["ID"];
$slogin=$myrow["email"];
$spass=$myrow["pass"];
}
} // есть пользователь

}
}
?>

Подобным образом делается авторизация через другие социальные сети: facebook, Одноклассники, Google, mail.ru

©Невежин Евгений
http://nevius.ru
15.12.2015

При перепечатке информации ссылка на сайт http://nevius.ru обязательна.