Сервис Яндекс.ID позволяет через 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>';
Если всё указано верно, то перейдя по ссылке откроется запрос на доступ:

Скрипт oauth_yandex.php
В скрипте получаем код авторизации, меняем его на токен и получаем данные пользователя.
Все запросы осуществляются методом 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
(
[id] => 474865459
[login] => it-stories
[client_id] => 8200b1175081452ba9f8aa0b698000a3
[display_name] => Роман Сергеевич
[real_name] => Роман Гринько
[first_name] => Роман
[last_name] => Гринько
[sex] => male
[default_email] => it-stories@yandex.ru
[emails] => Array
(
[0] => it-stories@yandex.ru
)
[birthday] => 1995-01-11
[default_avatar_id] => 59871/yap1e6EbJjl43jATcZjbRzyzLY-1968643369
[is_avatar_empty] =>
[psuid] => 1.AAn5CJ.JU4uFswwzfz_goyc5KtMTr.1R1mdmoWm4q8kIhI8wWi3w
)Подробнее о формате ответа в документации Яндекса.
Фото пользователя можно получить по ссылке, подставив полученный 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 вернет заглушку.