auth = $auth; $this->users = $users; $this->identities = $identities; } public function login($providerAlias, $userDetails, $callback = null) { $user = $this->getUser($providerAlias, $userDetails); $user = $this->runCallback($callback, $user, $userDetails); $this->updateUser($user, $providerAlias, $userDetails); $this->auth->login($user); } protected function getUser($providerAlias, \SocialNorm\User $details) { if ($this->identities->userExists($providerAlias, $details)) { return $this->getExistingUser($providerAlias, $details); } /** @var \App\Models\User $newuser */ $newuser = $this->users->create(); $newuser->name = $details->nickname ?: ($details->full_name ?: $details->email); $newuser->email = $details->email; return $newuser; } protected function runCallback($callback, $user, $userDetails) { $callback = $callback ?: function () {}; $callbackUser = $callback($user, $userDetails); return $callbackUser ?: $user; } protected function updateUser($user, $providerAlias, $details) { $this->users->store($user); $this->storeProviderIdentity($user, $providerAlias, $details); } protected function getExistingUser($providerAlias, $details) { $identity = $this->identities->getByProvider($providerAlias, $details); return $this->users->findByIdentity($identity); } protected function storeProviderIdentity($user, $providerAlias, $details) { if ($this->identities->userExists($providerAlias, $details)) { $this->updateProviderIdentity($providerAlias, $details); } else { $this->addProviderIdentity($user, $providerAlias, $details); } } protected function updateProviderIdentity($providerAlias, $details) { $identity = $this->identities->getByProvider($providerAlias, $details); $identity->access_token = $details->access_token; $this->identities->store($identity); } protected function addProviderIdentity($user, $providerAlias, $details) { $identity = new OAuthIdentity; $identity->user_id = $user->getKey(); $identity->provider = $providerAlias; $identity->provider_user_id = $details->id; $identity->access_token = $details->access_token; $this->identities->store($identity); } }