Тема:
Авторизация через ваш сайт. (Урок)Сообщение: Все знакомы к примеру с Авторизацией через соц сети - вк,фейсбук и так далее.
Мне захотелось реализовать что-то подобное для себя,ради интереса,вот что получилось.
Использовал PHP+cURL,ООП MySQL(i) (кодеры и под обычный мускул заточить смогут).
Поехали..
И так,структура:
Допустим у вас есть,сайт и вы хотите,чтоб его использовали как сервис авторизации/регистрации на своих сайтах.
Идея заключается в регистрации юзером ID приложения под авторизацию на свой сайт,а именно:
- Полный адрес обработчика (например
http://test.ru/lol.php)
- Полный адрес автологина (например
http://test.ru/autolog.php?id=#&pass=*)
Обратите внимание! После значения ID или Логина должен стоять именно символ # (решетка),а после значения пароля * (звездочка).
- Так же указываете Название приложения (оно будет выведено,когда перейдете на app.php?id=ID)
- КЛЮЧ,пожалуй самое главное,при регистрации приложения он генерируется и присваивается автоматически. Для чего он? - Для безопасности,потому что именно по нему обработчик будет определять существует ли POST запрос с этим ключом ИМЕННО на ваш сайт,Вы сами должны будете его указать у себя в обработчике lol.php.
Исходник выложу ниже...В нем есть Авторизация/Регистрация/Регистрация приложения
Для всего этого нам понадобится два основных PHP файла:
app.php
<?php
require $_SERVER['DOCUMENT_ROOT'].'/Core/DB.php'; //подключение к БД
$id = abs(intval($_GET['id'])); //фильтр id
$app_query = $DB->query("SELECT id FROM app WHERE id = '$id' LIMIT 1"
; //выборка логина из БД
if($app_query->fetch_row() > 0) //если ID приложения существует в БД
{ //то
$app_query = $DB->query("SELECT * FROM app WHERE id = '$id' LIMIT 1"
; //вытаскиваем инфу о нем
$app = $app_query->fetch_assoc(); //создаем массив
}
else //иначе
{
exit('Такого приложения не существует!');
}
if (isset($_COOKIE['id']) AND isset($_COOKIE['password']))
{
$query_auth = $DB->query("SELECT * FROM users WHERE user_id = '".abs(intval($_COOKIE['id']))."' AND user_password = '".$_COOKIE['password']."' LIMIT 1"
->fetch_array();
if ($query_auth != FALSE)
{
$login = $query_auth;
setcookie("id", $login['user_id'], $_SERVER['REQUEST_TIME'] +60*60*24*30);
setcookie("password", $login['user_password'], $_SERVER['REQUEST_TIME'] +60*60*24*30);
$Key = $app['key']; //вытаскиваем ключ приложения
$AutoLog = $app['autologin']; //вытаскиваем автологин приложения
$App = curl_init($app['url']); //создаем cURL сеанс (подключение к хосту)
curl_setopt($App,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']); //пишем браузер
curl_setopt($App,CURLOPT_REFERER,$Host); //пишем реферер
curl_setopt($App,CURLOPT_TIMEOUT,60); //тайм-аут ожидания ответа от сервера (60 сек)
curl_setopt($App, CURLOPT_RETURNTRANSFER,true); //возвращаем ответ сервера в переменную
curl_setopt($App, CURLOPT_POST, true); //включаем POST запросы
curl_setopt($App, CURLOPT_POSTFIELDS, 'app_'.$Key.'='.$Key.'&MyID='.$login['user_id'].'&MyLogin=id'.$login['user_id'].'&autologin='.$AutoLog.''); //обозначаем значения POST полей
$View = curl_exec($App); //выполняем запрос к хосту
echo $View; //выводим результат
curl_close($App); //закрываем соединение
exit; //закрываем выполнение скрипта
}
else
{
echo '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"><meta http-equiv="Content-Type" content="application/vnd.wap.xhtml+xml; charset=UTF-8" /><meta name="name" content="Hackster.Ru" />
<meta name="description" content="VITAMIN" />
<meta name="keywords" content="VITAMIN" />
<meta name="author" content="[VITAMIN]" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="shortcut icon" href="favicon.ico"/>
<link rel="stylesheet" href="http://localhost/Design/style.css" type="text/css"/>
<title>На райончике..</title>
<div class="title"><b>cURL Auth</b></div>
<div class="news">
<div class="main">Авторизация на <b>'.$app['site'].'</b></div>
</div>
<div class="main"><form action="enter.php?id='.$id.'" method="post">
Логин: <br><input name="login" type="text" placeholder="Логин.."/><br>
Пароль: <br><input name="password" type="password" placeholder="Пароль.."><br>
<input name="LogIn" type="submit" value="Войти"></form></div>
<div class="title">by [VITAMIN]</a></div>
<div class="title">(с) 2014 </div>';
}
}
else
{
echo '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"><meta http-equiv="Content-Type" content="application/vnd.wap.xhtml+xml; charset=UTF-8" /><meta name="name" content="Hackster.Ru" />
<meta name="description" content="VITAMIN" />
<meta name="keywords" content="VITAMIN" />
<meta name="author" content="[VITAMIN]" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="shortcut icon" href="favicon.ico"/>
<link rel="stylesheet" href="http://localhost/Design/style.css" type="text/css"/>
<title>На райончике..</title>
<div class="title"><b>cURL Auth</b></div>
<div class="news">
<div class="main">Авторизация на <b>'.$app['site'].'</b></div>
</div>
<div class="main"><form action="enter.php?id='.$id.'" method="post">
Логин: <br><input name="login" type="text" placeholder="Логин.."/><br>
Пароль: <br><input name="password" type="password" placeholder="Пароль.."><br>
<input name="LogIn" type="submit" value="Войти"></form></div>
<div class="title">by [VITAMIN]</a></div>
<div class="title">(с) 2014 </div>';
}
?>
Далее enter.php
<?php
require $_SERVER['DOCUMENT_ROOT'].'/Core/DB.php'; //подключение к БД
if(isset($_POST['LogIn'])) //если есть POST запрос
{ //то
$id = abs(intval($_GET['id'])); //фильтр ID
$app_query = $DB->query("SELECT id FROM app WHERE id = '$id' LIMIT 1"
; //выборка ID приложения из БД
if($app_query->fetch_row() > 0) //если ID приложения существует в БД
{ //то
$app_query = $DB->query("SELECT * FROM app WHERE id = '$id' LIMIT 1"
; //вытаскиваем всю инфу о приложении
$app = $app_query->fetch_assoc(); //создаем массив с этой инфой
}
else //иначе
{
exit('Такого приложения не существует!');
}
$Key = $app['key']; //Ключ приложения
$Host = $app['url']; //Адрес обработчика запроса
$AutoLog = $app['autologin']; //Адрес автологина
$PostLogin = $DB->real_escape_string($_POST['login']); //фильтр Логина
$user_query = $DB->query("SELECT user_id,user_login,user_password FROM users WHERE user_login = '".$PostLogin."' LIMIT 1"
; //выборка логина из БД
if($user_query == TRUE) //если такой логин существует в БД
{ //то
$login = $user_query->fetch_assoc(); //создаем по нему ассоциативный массив
if($login['user_password'] == $_POST['password']) //если пароль из массива равен паролю с POST запроса
{ //то
setcookie("id", $login['user_id'], $_SERVER['REQUEST_TIME']+60*60*24*30); //ставим в куки id
setcookie("password", $login['user_password'], $_SERVER['REQUEST_TIME']+60*60*24*30); //ставим в куки password
$App = curl_init($Host); //создаем cURL сеанс (подключение к хосту-обработчику)
curl_setopt($App,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']); //пишем браузер
curl_setopt($App,CURLOPT_TIMEOUT,60); //тайм-аут ожидания ответа от сервера (60 сек)
curl_setopt($App, CURLOPT_RETURNTRANSFER,true); //возвращаем ответ сервера в переменную
curl_setopt($App, CURLOPT_POST, true); //включаем POST запросы
curl_setopt($App, CURLOPT_POSTFIELDS, 'app_'.$Key.'='.$Key.'&MyID='.$login['user_id'].'&MyLogin=id'.$login['user_id'].'&autologin='.$AutoLog.''); //обозначаем значения POST полей
$View = curl_exec($App); //выполняем запрос к хосту
echo $View; //выводим результат запроса
curl_close($App); //закрываем соединение
exit; //закрываем выполнение скрипта
}
else //иначе
{
exit('Ошибка авторизации!');
}
}
else //иначе
{
exit('Юзера не существует!');
}
}
else //иначе
{
exit('Нет запроса!');
}
?>
Далее файл lol.php
Именно он должен быть обработчиком на хосте того,кто ругнул приложение.
<?php
require $_SERVER['DOCUMENT_ROOT'].'/Core/DB.php'; //подключение к БД
$Key = 'xYhKUoGyer'; //Ключ Вашего приложения
$AppKey = 'app_'.$Key; //ключ Юзера (Ник,Логин)
$auto = $DB->real_escape_string($_POST['autologin']); //автологин
$MyID = $DB->real_escape_string($_POST['MyID']);
if(isset($_POST[$AppKey])) //если существует ключевой POST запрос от приложения
{ //то
$Us = $DB->query("SELECT user_id FROM users WHERE MyID = '$MyID' LIMIT 1"
; //проверка существования моего моего ID в БД
if($Us->fetch_row() > 0) //если такой ID существует в БД
{ //то
$USER = $DB->query("SELECT user_id,user_login,user_password FROM users WHERE MyID = '$MyID' LIMIT 1"
; //вытаскиваем текущие ID,Логин,Пароль
$login = $USER->fetch_assoc(); //создаем по нему ассоциативный массив
$auto = str_replace('#',$login[user_id],$auto); //вставка логина
$auto = str_replace('*',$login[user_password],$auto); //вставка пароля
echo '<script language="JavaScript">window.location.href="'.$auto.'"</script>'; //бросаем на Ваш автологин через JavaScript
exit;
}
else //иначе регистрируем
{
$Pass = substr(str_shuffle('QWERTYUIOPASDFGHJKLZXCVBNM123456789qwertyuiopasdghjklzxcvbnm'),0,10); //генерируем сложный пароль
$MyLogin = $DB->real_escape_string($_POST['MyLogin']); //фильтр Логина
$DB->query("INSERT INTO users SET user_login = '$MyLogin', user_password = '$Pass', MyID = '$MyID' "
; //Запись аккаунта в БД
echo 'Регнули!!!';
$last = $DB->query("SELECT user_id FROM users ORDER by user_id DESC LIMIT 1"
; //выборка последнего ID из БД
while ($new = $last->fetch_assoc())
{
$auto = str_replace('#',$new[user_id],$auto); //вставка логина
$auto = str_replace('*',$Pass,$auto); //вставка пароля
echo '<script language="JavaScript">window.location.href="'.$auto.'"</script>'; //бросаем на Ваш автологин через JavaScript
exit;
}
} //конец регистрации
} //конец
else //иначе
{
exit('Не верный ключ!');
}
?>
Это не для новичков (по-этому все детально буду пол года разжовывать),а для толковых кодеров,именно для них и выкладываю ядро..
В архиве движек,бд - vitamin.sql,и сразу после ее заливки, входите под логином VITAMIN,паролем vitamin1234 регистрируйте приложение.
Гкод местами есть,но я не писал обычный сайт,а систему авторизации через ваш сайт,так что простительно))
Врядли кого-то это заинтересует,ведь я не выложил мод кх или 664)
Удачи.
Добавлено 18.04.14 в 22:23:33:
ядро..