Сервис Яндекс.Паспорт позволяет через API реализовать авторизацию пользователя на своем сайте. После разрешения доступа можно получить имя, фамилию, никнейм, e-mail и фото пользователя.
Для доступа к API нужно зарегистрировать приложение.
На странице https://oauth.yandex.ru/client/new указываются «Название приложения», другие поля не обязательны.
В платформах, нужно указать «Веб-сервисы» и указать в «Callback URI #1» адрес к PHP-скрипту, который будет обрабатывать авторизацию (например https://example.com/login_ya.php).
В разделе «Доступы», «API Яндекс.Паспорта» отметь нужные данные:
После отправки формы получим ID и пароль приложения.
Сформируем и выведем ссылку, по которой пользователь будет проходить авторизацию. Значение параметра redirect_uri
должно совпадать с Callback URI #1.
В параметре state
можно передавать свои данные, которые вернутся в PHP-скрипт обработчика.
$params = array(
'client_id' => 'ID_ПРИЛОЖЕНИЯ',
'redirect_uri' => 'https://example.com/login_ya.php',
'response_type' => 'code',
'state' => '123'
);
$url = 'https://oauth.yandex.ru/authorize?' . urldecode(http_build_query($params));
echo '<a href="' . $url . '">Авторизация через Яндекс</a>';
Если всё указано верно, то перейдя по ссылке откроется запрос на доступ:
В скрипте получаем код авторизации, меняем его на токен и получаем данные пользователя.
Все запросы осуществляются методом POST, также Яндекс рекомендует передавать токен в HTTP заголовке Authorization
, так он не сохранится в истории браузера.
<?php
$state = $_GET['state']; // 123
if (!empty($_GET['code'])) {
// Отправляем код для получения токена (POST-запрос).
$params = array(
'grant_type' => 'authorization_code',
'code' => $_GET['code'],
'client_id' => 'ID_ПРИЛОЖЕНИЯ',
'client_secret' => 'ПАРОЛЬ_ПРИЛОЖЕНИЯ',
);
$ch = curl_init('https://oauth.yandex.ru/token');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$data = curl_exec($ch);
curl_close($ch);
$data = json_decode($data, true);
if (!empty($data['access_token'])) {
// Токен получили, получаем данные пользователя.
$ch = curl_init('https://login.yandex.ru/info');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('format' => 'json'));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ' . $data['access_token']));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$info = curl_exec($ch);
curl_close($ch);
$info = json_decode($info, true);
print_r($info);
}
}
Результат:
array(
'first_name' => 'Иван',
'last_name' => 'Иванов',
'display_name' => 'Uername',
'emails' => array(
0 => 'mail@exaple.com'
),
'default_avatar_id' => '50595/enc-5f71e264ee8dd424db9987567567534275688ec6baa71854f',
'default_email' => 'mail@exaple.com',
'real_name' => 'Иван Иванов',
'is_avatar_empty' => false,
'client_id' => 'ID_ПРИЛОЖЕНИЯ',
'login' => 'Uername',
'sex' => 'male',
'id' => '43231295'
)
Подробнее о формате ответа в документации Яндекса.
Фото пользователя можно получить по ссылке, подставив полученный default_avatar_id
:
https://avatars.yandex.net/get-yapic/
default_avatar_id
/islands-retina-50
И размер фото, возможные размеры:
islands-small |
28×28px |
islands-34 |
34×34px |
islands-middle |
42×42px |
islands-50 |
50×50px |
islands-retina-small |
56×56px |
islands-68 |
68×68px |
islands-75 |
75×75px |
islands-retina-middle |
84×84px |
islands-retina-50 |
100×100px |
islands-200 |
200×200px |
Если параметр is_avatar_empty = true
, то это означает, что у пользователя нет фото и запрос к avatars.yandex.net
вернет заглушку.