/** * Find the existing user or create a new one for this account. * * @param $provider * * @throws EmailAlreadyInUse * * @return User */ public function findOrCreateUser($provider) : User { /** @var \Laravel\Socialite\Two\User $providerUser */ $providerUser = $this->socialite->driver($provider)->user(); $user = User::byProvider($provider, $providerUser->id)->first(); if (is_null($user)) { $user = User::where('email', $providerUser->getEmail())->first(); // If provider isn't associated with user, do that now if (is_null($user)) { return $this->registrar->create($provider, $providerUser); } $userProvider = app(UserProvider::class, [['provider' => $provider, 'provider_id' => $providerUser->getId()]]); $user->providers()->save($userProvider); return $user; } // update the avatar if it has changed if (!is_null($providerUser->getAvatar()) && $user->avatar != $providerUser->getAvatar()) { $user->update(['avatar' => $providerUser->getAvatar()]); } return $user; }