scopes(['openid', 'profile', 'name', 'email']) ->redirect(); } public function handleProviderCallback(string $driver) { $social = Socialite::driver($driver)->user(); $user = User::where(['email' => strtolower($social->getEmail())])->first(); if ($user == null) { $user = User::where(['username' => strtolower($social->getNickname())])->first(); } if ($user) { Auth::login($user); $updates = []; if (blank($user->profile_photo_path)) { $updates['profile_photo_path'] = $this->buildAvatarUrl($social->getAvatar(), $social->token); $updates['profile_photo_path'] = $this->fetchAvatar($social->getAvatar(), $social->token, $user->profilePhotoDisk()); } if (blank($user->email)) { $updates['email'] = $social->getEmail(); } $updates = array_purge($updates); if (! empty($updates)) { $user->update($updates); } return redirect()->route('staff.worklist.index'); } else { $provider = ucfirst($driver); return redirect() ->route('login') ->withErrors("Email or username not found for {$provider} login."); } } public function buildAvatarUrl(?string $avatar_url, ?string $access_token): ?string { if (blank($avatar_url)) { return null; } if (filled($access_token)) { $avatar_url .= "?access_token={$access_token}"; } return $avatar_url; } public function fetchAvatar(?string $avatar_url, ?string $access_token, string $disk): ?string { $url = $this->buildAvatarUrl($avatar_url, $access_token); if (blank($url)) { return null; } try { $response = Http::get($url); if ($response->successful()) { $filename = 'avatars/' . Str::uuid() . '.jpg'; Storage::disk($disk)->put($filename, $response->body()); return $filename; } } catch (Exception) { } return null; } }