Решил прикрутить к сайту аутентификацию через социальные сети. Речь пойдёт конкретно о Google. Как и полагается, в консоли управления создал новое Веб-приложение, затем активировал необходимую Google+ Api. Дальше возникла проблема. На конечном этапе, после того как пользователь разрешает доступ к своему аккаунту, через ACCESS_TOKEN
пытаюсь получить email
этого пользователя. Выдаёт ошибку Not Found. Перерыл документацию, не могу понять в чём дело. Код в студию:
HTML:
<a href='https://accounts.google.com/o/oauth2/auth?client_id=126263635&redirect_uri=https://mysite.ru/social.php&response_type=code&access_type=offline&state=google&scope=https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email'>Войти через Google</a>
social.php:
$code = trim($_GET['code']); // получаем CODE
function file_get_curl_contents($url,$params){
$data = "";
if(function_exists('curl_init')){
$headers = array('Content-type: application/x-www-form-urlencoded', 'Content-length: ' . strlen($params));
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode($params));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$data = curl_exec($curl);
curl_close($curl);
return $data;
} else {
return false;
}
}
$client_id = '126263635'; // идентификатор приложения Google
$client_secret = 'secret126263635'; // секретный код приложения Google
$redirect_uri = 'https://mysite.ru/social.php'; // доверенный файл обработчик
// меняем CODE на ACCESS_TOKEN
$url = "https://accounts.google.com/o/oauth2/token";
$options = "client_id=".$client_id."&client_secret=".$client_secret."&redirect_uri=".$redirect_uri."&grant_type=authorization_code&code=".$code;
$get_content = file_get_curl_contents($url,$options);
$get_json = json_decode($get_content);
if(isset($get_json->{'access_token'})) {
// используем полученный ACCESS_TOKEN для доступка к информации пользователя
$url = "https://www.googleapis.com/plus/v1/people/me";
$options .= "access_token=".$get_json->{'access_token'};
$get_content = file_get_curl_contents($url,$options);
echo $get_content; // возращает Not Found
}
Проблема решена. При запросе пользовательских данных, следовало использовать метод GET, вместо метода POST. Внёс коррективы в следующий блок:
$code = trim($_GET['code']); // получаем CODE
function file_get_curl_contents($url,$params,$method){
$data = "";
if(function_exists('curl_init')){
$curl = curl_init();
$headers = array('Content-type: application/x-www-form-urlencoded', 'Content-length: ' . strlen($params));
if($method == "POST") {
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, urldecode($params));
} elseif($method == "GET") {
curl_setopt($curl, CURLOPT_URL, $url."?".urldecode($params));
} else {
return false;
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($curl);
curl_close($curl);
return $data;
} else {
return false;
}
}
$client_id = '126263635'; // идентификатор приложения Google
$client_secret = 'secret126263635'; // секретный код приложения Google
$redirect_uri = 'https://mysite.ru/social.php'; // доверенный файл обработчик
// меняем CODE на ACCESS_TOKEN
$url = "https://accounts.google.com/o/oauth2/token";
$options = "client_id=".$client_id."&client_secret=".$client_secret."&redirect_uri=".$redirect_uri."&grant_type=authorization_code&code=".$code;
$get_content = file_get_curl_contents($url,$options,"POST");
$get_json = json_decode($get_content);
if(isset($get_json->{'access_token'})) {
// используем полученный ACCESS_TOKEN для доступка к информации пользователя
$url = "https://www.googleapis.com/plus/v1/people/me";
$options .= "access_token=".$get_json->{'access_token'};
$get_content = file_get_curl_contents($url,$options,"GET");
echo $get_content; // теперь возвращает нужные данные
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Использую библиотеку веб-сокетов consik/yii2-websocket