Закрыть окно авторизации Yandex ID
При клике на кнопку "Войти как" открывается новое окно в браузере, получаем данные пользователя и сохраняем у себя. Как закрывать это окно и редиректить на другую страницу?
index.php
<!doctype html>
<html lang="ru">
<head>
<meta charSet="utf-8" />
<meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, shrink-to-fit=no, viewport-fit=cover'>
<meta http-equiv='X-UA-Compatible' content='ie=edge'>
<style>
html,
body {
background: #eee;
}
</style>
<script src="https://yastatic.net/s3/passport-sdk/autofill/v1/sdk-suggest-with-polyfills-latest.js"></script>
</head>
<body>
<script>
window.onload = function() {
window.YaAuthSuggest.init({
client_id: 'ид',
response_type: 'token',
redirect_uri: 'https://сайт/auth/yandex/get_token.php'
},
'https://сайт', {
view: 'button',
parentId: 'container',
buttonView: 'main',
buttonTheme: 'light',
buttonSize: 'm',
buttonBorderRadius: 0
}
)
.then(function(result) {
return result.handler();
})
.then(function(data) {
console.log('Сообщение с токеном: ', data);
document.body.innerHTML += `Сообщение с токеном: ${JSON.stringify(data)}`;
})
.catch(function(error) {
console.log('Что-то пошло не так: ', error);
document.body.innerHTML += `Что-то пошло не так: ${JSON.stringify(error)}`;
});
};
</script>
</body>
</html>
authorize.php
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
global $USER;
define('URL', 'https://login.yandex.ru/info?');
function get_data(){
//Запрос данных у яндекса.
$token = ($_GET['token']);
$token = explode('=', $token)[1];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: OAuth ' . $token,
'Content-type: text/html',
'charset=UTF-8',
]);
$response = curl_exec($ch);
if (curl_errno($ch)){
die(curl_errno($ch));
}
$json = json_decode($response,true);
return $json;
}
if ($USER->IsAuthorized()){
LocalRedirect('/personal/index.php');
}
$data = get_data();
if (!$data['default_email']){
die;
};
$fields = [
"NAME" => $data['first_name'] ? $data['first_name'] : false,
'LAST_NAME' => $data['last_name'] ? $data['last_name'] : false,
'LOGIN' => $data['default_email'] ? $data['default_email'] : false,
'PHONE_NUMBER' => $data['default_phone'] ? ($data['default_phone'])['number'] : false,
'EMAIL' => $data['default_email'] ? $data['default_email'] : false,
];
$user = CUser::GetList(($by="id"), ($order="desc"), // Ищем пользователя по почте
["EMAIL" => $fields['EMAIL']]) ->fetch();
if (!$user){
$userbyphone = \Bitrix\Main\UserPhoneAuthTable::getList($parameters = [
'filter'=> ["PHONE_NUMBER" => $fields['PHONE_NUMBER']] // Ищем пользователя по телефону
]) -> fetch();
if (!$userbyphone){
// Пытаемся создать пользователя
$user = new CUser;
$password = randString(12);
$ID = $user->Add([
'LOGIN' => $fields['EMAIL'],
'NAME' => $fields['NAME'],
'LAST_NAME' => $fields['LAST_NAME'],
'EMAIL' => $fields['EMAIL'],
'PASSWORD' => $password,
'CONFIRM_PASSWORD' => $password,
'PHONE_NUMBER' => $fields['PHONE_NUMBER'],
'ACTIVE' => 'Y',
"GROUP_ID" => [3, 4, 6],
'PERSONAL_PHONE' => $fields['PHONE_NUMBER']]
);
if (!$ID){
die($ID->LAST_ERROR);
}
}
else {
$ID = $userbyphone['USER_ID'];
}
}
else{
$ID = $user['ID'];
}
$auResult = $USER->Authorize($ID); // Авторизируем пользователя
if (!$auResult){
die('Ошибка авторизации');
}
LocalRedirect('/personal/index.php');
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php';
get_token.php
<script language="javascript">
var hash = window.location.hash.substring(1);
window.location.href='authorize.php?display=popup&token=' + hash;
</script>
Источник: Stack Overflow на русском