Авторизация на сайте через Яндекс

Сервис Яндекс.Паспорт позволяет через 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>';
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);
	}
}
PHP

Результат:

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 вернет заглушку.

27.11.2019, обновлено 07.12.2020
7961
Предыдущая запись Вход через Google
Следующая запись Хеширование строк в PHP

Комментарии 2

Эдуард Сингилеев Эдуард Сингилеев
11 июня 2020 в 14:02
+1
А у Вас авторизация по соц. сетям реализована с помощью плагина или ручками?

, чтобы добавить комментарий.

Другие публикации

Вход через Google
Сервис «Google Аккаунты» позволяет через протокол OAuth 2.0 реализовать авторизацию пользователя на своем сайте. После прохождения авторизации можно получить имя, фамилию, e-mail и юзерпик...
19395
+14
Публикация записей на стену сообщества VK
Для начала вы должны быть авторизированы в VK и являться администратором группы или страницы. Далее нужно создать...
19520
+3
Работа с API Instagram
В статье описана регистрация клиента, получения access token, примеры использования методов API Instagram на PHP.
20782
+3
Использование API Яндекс Диска на PHP
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
37941
+13
Метрика API
API Яндекс метрики позволяет получить информацию о посещаемости сайта и формировать отчеты, но с ограничением в 30 запросов в секунду и 5000 в сутки.
9541
+7
Публикация на страницу Facebook через PHP
Facebook ограничил свободный доступ к API. Теперь чтобы получить права для публикации записей нужно...
13697
+3