
Авторизация через github
Скрипт авторизации через GitHub, позволяющая сократить время регистрации пользователя на вашем сайте.
Al-Sher
Как я и говорил выкладываю свой код для авторизации через github :)
Весь код можно найти тут
И так, начнем :)
Для начала нам необходимо создать новое приложение. Сделать это можно на данной странице: https://github.com/settings/applications/new
Далее мы собираем все полученные данные в массив:
$gh=array('id'=>'ID_Приложения','key'=>'Секретный_ключ','redirect'=>'страница_редиректа');
ID_Приложения и Секретный_ключ вводите полученные от github!
После этого можно начинать делать ссылку:
$link= '<a href="https://github.com/login/oauth/authorize?client_id='.$gh["id"].'&redirect_uri='.$gh["redirect"].'&scope=user,&state=github"> Аутентификация черези github</a>';
Перейдя по данной ссылке, если всё сделано правильно, вы перейдете на страницу github, где вас попросят подтвердить разрешения. После подтверждения вы перейдете на "страница_редиректа", которую мы указывали выше.
Проверяем пришел ли необходимый для нас код и правда ли мы пришли от github`a(за это отвечает GET переменная state, которая возвращается неизменной)
if(isset($_GET["state"]) and @$_GET["state"]=='github' and isset($_GET["code"])) {
Если всё хорошо, то преобразуем все данные в массив для более удобной отправки
$params = array(
'client_id'=> $gh["id"],
'client_secret'=> $gh["key"],
'code'=> $_GET["code"],
'redirect_uri'=> $url_r
);
Пишем POST запрос к github`у и разбираем ответ
$url = 'https://github.com/login/oauth/access_token';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode(http_build_query($params)));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($curl);
curl_close($curl);
parse_str($result, $result);
Если всё хорошо, то мы получим access token, который необходим для получения данных о пользователе. Переходим к заключительному шагу: Получение данных о пользователе.
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_URL, 'https://api.github.com/user?access_token='.urlencode($result["access_token"]));
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
if(strpos($result, "HTTP/1.1 500 Internal Server Error") === true) $result = false;
$userInfo = json_decode($result);
Если присмотреться, то в этот раз мы уже делаем вид, что заходим через браузер "мозила" с включенными куками. Так же переменная userInfo имеет структуру объекта, а не массива, а значит нужно обращаться к данным примерно так: $userInfo->id
На этом я закончу данный пост :) Надеюсь всё было понятно, но всё же буду рад вопросам по данному коду :)