WebWost WebWostbeta

Авторизация через github

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

PHP

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

На этом я закончу данный пост :) Надеюсь всё было понятно, но всё же буду рад вопросам по данному коду :)

0 комментариев

Новый комментарий