Реализация авторизации через Google на сайте
Google OAuth 2.0 — один из самых распространённых способов авторизации. Интегрируется через стандартный OAuth2-флоу или через Google Identity Services (GIS) — новый JS SDK для кнопки «Sign in with Google».
Регистрация OAuth-клиента
- Google Cloud Console → APIs & Services → Credentials
- Создать OAuth 2.0 Client ID типа Web application
- Добавить Authorized redirect URIs:
https://example.com/auth/google/callback - Сохранить Client ID и Client Secret
Laravel Socialite
composer require laravel/socialite
// config/services.php
'google' => [
'client_id' => env('GOOGLE_CLIENT_ID'),
'client_secret' => env('GOOGLE_CLIENT_SECRET'),
'redirect' => env('GOOGLE_REDIRECT_URI'),
],
// routes/web.php
Route::get('/auth/google', [GoogleAuthController::class, 'redirect']);
Route::get('/auth/google/callback', [GoogleAuthController::class, 'callback']);
class GoogleAuthController extends Controller
{
public function redirect(): RedirectResponse
{
return Socialite::driver('google')
->scopes(['openid', 'profile', 'email'])
->redirect();
}
public function callback(): RedirectResponse
{
try {
$googleUser = Socialite::driver('google')->user();
} catch (\Exception $e) {
return redirect('/login')->withErrors(['google' => 'Ошибка авторизации через Google']);
}
$user = User::updateOrCreate(
['google_id' => $googleUser->getId()],
[
'name' => $googleUser->getName(),
'email' => $googleUser->getEmail(),
'email_verified_at' => now(),
'avatar' => $googleUser->getAvatar(),
]
);
Auth::login($user, remember: true);
return redirect()->intended('/dashboard');
}
}
Связь с существующим аккаунтом
Если пользователь уже зарегистрирован с тем же email через пароль — нужно решить, как объединить аккаунты:
public function callback(): RedirectResponse
{
$googleUser = Socialite::driver('google')->user();
// Ищем по google_id
$user = User::where('google_id', $googleUser->getId())->first();
// Если нет — ищем по email (связываем существующий аккаунт)
if (!$user) {
$user = User::where('email', $googleUser->getEmail())->first();
if ($user) {
$user->update(['google_id' => $googleUser->getId()]);
} else {
$user = User::create([
'google_id' => $googleUser->getId(),
'name' => $googleUser->getName(),
'email' => $googleUser->getEmail(),
'email_verified_at' => now(),
]);
}
}
Auth::login($user, remember: true);
return redirect()->intended('/dashboard');
}
One Tap / Google Identity Services
Новый Google Identity Services SDK позволяет показать popup «One Tap» без редиректа:
<script src="https://accounts.google.com/gsi/client" async defer></script>
<div id="g_id_onload"
data-client_id="{{ config('services.google.client_id') }}"
data-callback="handleGoogleResponse"
data-auto_prompt="false">
</div>
<div class="g_id_signin" data-type="standard"></div>
function handleGoogleResponse(response) {
// response.credential — это id_token (JWT)
fetch('/auth/google/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': csrfToken },
body: JSON.stringify({ credential: response.credential }),
}).then(r => r.json()).then(data => {
if (data.redirect) window.location.href = data.redirect;
});
}
// Верификация id_token на сервере
use Google\Client as GoogleClient;
public function handleToken(Request $request): JsonResponse
{
$client = new GoogleClient(['client_id' => config('services.google.client_id')]);
$payload = $client->verifyIdToken($request->credential);
if (!$payload) {
return response()->json(['error' => 'Invalid token'], 401);
}
$user = User::updateOrCreate(
['google_id' => $payload['sub']],
['name' => $payload['name'], 'email' => $payload['email']]
);
Auth::login($user);
return response()->json(['redirect' => '/dashboard']);
}
Сроки
Стандартный OAuth2-флоу через Socialite — 1–2 рабочих дня. С One Tap и объединением аккаунтов — 2–3 дня.







