namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\ServiceProvider;
use LaravelSocialite\GoogleOneTap\LaravelGoogleOneTapServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Event::listen(function (\SocialiteProviders\Manager\SocialiteWasCalled $event) {
$event->extendSocialite('laravel-google-one-tap', LaravelGoogleOneTapServiceProvider::class);
});
}
}
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use LaravelSocialite\GoogleOneTap\LaravelGoogleOneTapServiceProvider;
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
\SocialiteProviders\Manager\SocialiteWasCalled::class => [
// other providers
LaravelGoogleOneTapServiceProvider::class,
],
];
}
// routes/web.php
#if you want use only google one tap
use App\Controllers\GoogleOneTapController;
use Illuminate\Support\Facades\Route;
Route::post('auth/google/onetap', [GoogleOneTapController::class, 'handler'])
->middleware('guest')
->name('google-one-tap.handler');
----------------- or ------------------
#if you want use with any provider
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\AuthController;
Route::controller(AuthController::class)->prefix('auth')->group(function () {
Route::get('{provider}', 'redirectToProvider')->name('provider.auth');
Route::get('{provider}/callback', 'callbackToProvider');
Route::post('google/onetap', 'googleOneTap')->middleware('guest')->name('google-one-tap.handler');
});
use Laravel\Socialite\Facades\Socialite;
return Socialite::driver('laravel-google-one-tap')->userFromToken($token);
// GoogleOneTapController.php
use App\Models\User;
use Illuminate\Http\Request;
use Laravel\Socialite\Facades\Socialite;
use LaravelSocialite\GoogleOneTap\InvalidIdToEx;
public function handler(Request $request)
{
// Verify and validate JWT received from Google One Tap prompt
try {
$googleUser = Socialite::driver('laravel-google-one-tap')->userFromToken($request->input('credential'));
} catch (InvalidIdToEx $exception) {
return response()->json(['error' => $exception]);
}
// Log the user in if the email is associated with a user
try {
$googleUser = User::where('email', $googleUser['email'])->firstOrfail();
} catch (\Exception $ex) {
$user = User::create([
'name' => $googleUser->getName(),
'lastName' => $googleUser->getNickName(),
'provider_name' => 'google-one-tap',
'email' => $googleUser->getEmail(),
'password' => Hash::make($googleUser->getId()),
'email_verified_at' => $googleUser->user['email_verified'] ? now() : null,
'profile_photo_path' => $googleUser->getAvatar()
]);
Auth::login($user, $remember = true);
return redirect()->route('home');
}
Auth::login($googleUser, $remember = true);
// Send user to Home
return redirect()->route('home');
}
// AuthController.php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User\User;
use App\Models\User\UserProviderProfile;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Laravel\Socialite\Facades\Socialite;
class AuthController extends Controller
{
public function redirectToProvider($provider)
{
return Socialite::driver($provider)->redirect();
}
public function callbackToProvider($provider)
{
try {
$socialiteUser = Socialite::driver($provider)->user();
} catch (\Exception $ex) {
Log::error("Social login error: " . $ex->getMessage());
return redirect()->route('login')->with('error', 'An error occurred while logging in.');
}
// Check if the user already exists
$user = User::where('email', $socialiteUser->getEmail())->first();
if (!$user) {
// Create a new user only if they don't exist
$user = User::create([
'name' => $socialiteUser->getName(),
'provider_name' => $provider,
'email' => $socialiteUser->getEmail(),
'password' => Hash::make($socialiteUser->getId()), // Not used but One Tap Error: user_id is null for email: " . ($googleUser->getEmail() ?? 'unknown'));
return response()->json(['error' => 'User not found or not created'], 400);
}
// Log in the user
Auth::login($user, true);
return redirect()->route('home');
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.