Реализация авторизации через Яндекс ID на сайте
Яндекс ID — система авторизации Яндекса. Актуальна для российской аудитории: у многих пользователей есть Яндекс.Почта, и вход через неё снижает трение при регистрации. Реализуется через OAuth2 с поддержкой OpenID Connect.
Регистрация приложения
- oauth.yandex.ru → Создать приложение
- Указать название, тип — Веб-сервисы
- Добавить Callback URI:
https://example.com/auth/yandex/callback - В разделе Доступы добавить: Яндекс ID (адрес электронной почты, имя пользователя, аватар)
- Сохранить ClientID и Client secret
Laravel Socialite
composer require laravel/socialite socialiteproviders/yandex
// config/services.php
'yandex' => [
'client_id' => env('YANDEX_CLIENT_ID'),
'client_secret' => env('YANDEX_CLIENT_SECRET'),
'redirect' => env('YANDEX_REDIRECT_URI'),
],
class YandexAuthController extends Controller
{
public function redirect(): RedirectResponse
{
return Socialite::driver('yandex')->redirect();
}
public function callback(): RedirectResponse
{
try {
$yandexUser = Socialite::driver('yandex')->user();
} catch (\Exception $e) {
return redirect('/login')->withErrors(['yandex' => 'Ошибка авторизации через Яндекс']);
}
$user = User::updateOrCreate(
['yandex_id' => $yandexUser->getId()],
[
'name' => $yandexUser->getName(),
'email' => $yandexUser->getEmail(),
'email_verified_at' => now(),
'avatar' => $yandexUser->getAvatar(),
]
);
Auth::login($user, remember: true);
return redirect()->intended('/dashboard');
}
}
Получение данных через API Яндекс ID
Помимо OAuth callback, можно запросить данные через API напрямую:
$response = Http::withToken($accessToken)
->get('https://login.yandex.ru/info', [
'format' => 'json',
]);
$data = $response->json();
// $data['id'] — уникальный ID
// $data['login'] — логин
// $data['default_email']— основной email
// $data['real_name'] — имя
// $data['display_name'] — отображаемое имя
// $data['default_avatar_id'] — ID аватара
Аватар Яндекса строится по шаблону:
https://avatars.yandex.net/get-yapic/{avatar_id}/islands-200
Размеры: islands-50, islands-100, islands-200.
Связь с существующим аккаунтом
$user = User::where('yandex_id', $yandexUser->getId())->first()
?? User::where('email', $yandexUser->getEmail())->first();
if ($user && !$user->yandex_id) {
$user->update(['yandex_id' => $yandexUser->getId()]);
} elseif (!$user) {
$user = User::create([
'yandex_id' => $yandexUser->getId(),
'name' => $yandexUser->getName(),
'email' => $yandexUser->getEmail(),
'email_verified_at' => now(),
]);
}
Сроки
Стандартный OAuth2-флоу — 1–2 рабочих дня.







