пятница, 6 февраля 2015 г.

0Auth авторизация на сайте с помощью VK FB MAIL YANDEX GOOGLE

Общий смысл:

По кнопке социальнй сети, открывается окно с авторизацией выбранной соц. сети.
После входа, окно авторизации закрывается, в поля формы родительского окна передаются данные пользователя.




Список социальных сетей, с помощью которых будем авторизоваться:
 - google
 - yandex
 - mail.ru
 - facebook.com
 - vk.com


Общая информация и структура

config.php  -  файл с настройками приложения (client id, secret key, callback, path)
login.php - файл с кнопкой для авторизации.
redirect.php - определяет страницу перенаправления, если пользователь не авторизован
callback.php -обработка дынных авторизации, получение access_tocken
index.php - выполняется при успешной авторизации.

FACEBOOK

0. Регистрируем web приложение, и получаем CLIENT_ID, SECRET

1. config.php - прописываем полученные данные

// id приложения  
define("FCLIENT_ID", "465465464646");

// защищенный ключ
define("FSECRET", "1231321321313213213213213131313");

// куда перенаправим пользователя после авторизации

define("FOAUTH_CALLBACK", "callback.php");
// настройки доступа

define("FSCOPE", "email,user_about_me,user_birthday,user_hometown,user_location,user_relationship_details,user_relationships");
// путь к папке со скриптами

define("FPATH", "http://domain.ru/auths/fb/");

2. login.php - ссылка, которая открывает новое окно с авторизацией facebook

<?
require_once("config.php");  //подключаем конфиг
$link = 'https://www.facebook.com/dialog/oauth?client_id='.FCLIENT_ID.'&redirect_uri='.FPATH.FOAUTH_CALLBACK.'&scope='.FSCOPE;
?> <a class="href" onClick="window.open('<?=$link?>','mywindow','width=500,height=500')"><img src="images/fb_com.png" height=40 border="0" /></a>

3. redirect.php

<?
require_once("config.php");
//перенаправляем на авторизацию
header('Location: '.FPATH.'login.php');
?>

4. callback.php - Получаем acces_tocken

<?
session_start();
require_once("config.php");
// получили параметр code
if (isset($_GET['code'])) {
function curl_get_contents($url)
{
  $ch = curl_init($url);
  //curl_setopt($curl, CURLOPT_GET, 1);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}
$resp = "https://graph.facebook.com/oauth/access_token?client_id=".FCLIENT_ID."&redirect_uri=".FPATH.FOAUTH_CALLBACK."&client_secret=".FSECRET."&code=".$_GET['code'];
$answer = curl_get_contents($resp);
foreach (explode('&', $answer) as $chunk) {
 
$param[] = explode("=", $chunk);
    if ($param) {
        $answers['access_token'] = urldecode($param[0][1]);
    }
}

    if($answers['access_token']){
        $_SESSION['access_token'] = $answers['access_token'];
        // переадресуем пользователя на нужную страницу
        header('Location: '.FPATH.'index.php');
        exit();
    }
}
?>

5. Получаем необходимые нам данные, возвращаем пользователя из открытого окна авторизации, в родительское окно, и передаем полученные в ходе авторизации данные.

<?session_start();
header('Content-Type: text/html; charset=utf-8');
require_once("config.php");
if(isset($_SESSION['access_token'])) {
function curl_get_contents($url)
{
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}
//Получаем данные пользователя
$resp = "https://graph.facebook.com/me?fields=email,id,name,first_name,last_name,middle_name,location,picture&access_token=".$_SESSION['access_token'];
$data[response] = json_decode(curl_get_contents($resp), true);
$uid = $data[response]["id"];
//Записываем данные в сессию
$_SESSION['user']['firstname'] = $data[response]["last_name"];
$_SESSION['user']['lastname'] = $data[response]["first_name"];
if(isset($data[response]["middle_name"])) { $_SESSION['user']['thirdname'] = $data[response]["middle_name"];} else {$_SESSION['user']['thirdname'] = "";}
if(isset($data[response]["phone"])) {$_SESSION['user']['phone'] = $data[response]["phone"];}
else { $_SESSION['user']['phone'] = ""; }
$_SESSION['user']['email'] = $data[response]["email"];
$_SESSION['user']['about'] = "1";
$_SESSION['user']['userfb'] = $uid;
$_SESSION['uid'] = $uid;
$_SESSION['user']['fotopic'] = $data[response]["picture"]["data"]["url"];
$foto = $data[response]["picture"]["data"]["url"];

?>
<input type="hidden" value="<?=$data[response]["last_name"].":".$data[response]["first_name"].":".$data[response]["phone"].":".$data[response]["email"]?>" id="value">
<script src="scripts/jquery-1.8.3.js"></script>
<script>
//Закрываем текущее окно, и передаем окну родителю информацию о пользователе (заполняем поля формы)
$(document).ready(function(){
if(window.opener) {
var user = $("#value").val().split(":");
var w = window.opener;
w.$('#inputname').val(user[0]+" "+user[1]);
w.$('#inputemail').val(user[3]);
w.$('#inputphone').val(user[2]);
self.close(); }
});
</script>
<?
mysql_close();
}
else {
    require_once("redirect.php");
}
?>


Комментариев нет: