/** * check if the user has data in the user provider table. If not add it. Then log them in */ public function callback($provider_name) { $auth_user = Auth::user(); $redir = session('oauth_redir'); session()->forget('oauth_redir'); try { $provider = Provider::where('provider_safe_name', '=', $provider_name)->firstOrFail(); } catch (ModelNotFoundException $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; exit; } $user = Socialite::driver($provider_name)->user(); $local_user = UserProvider::where('provider_key', $user['id'])->first(); if (count($local_user)) { $local_user = $local_user->user()->first(); } else { if (empty($auth_user)) { $local_user = User::where('email', $user['email'])->first(); } else { $local_user = $auth_user; } //not found by email either if (!count($local_user)) { //create user $local_user = User::create(['first_name' => $user['name'], 'email' => $user['email']]); UserProvider::create(['provider_id' => $provider->id, 'user_id' => $local_user['id'], 'provider_key' => $user['id']]); } else { //update user with UserProvider::create(['provider_id' => $provider->id, 'user_id' => $local_user['id'], 'provider_key' => $user['id']]); } } Auth::login($local_user, true); switch ($redir) { case "profile": Alert::add("Social network has been added to your profile", ["alert_type" => "success"]); break; } return redirect()->route($redir); }
/** * Remove user a social network connection from a user * * @return view (via redirect) */ public function remove_provider($provider_id) { $id = Auth::id(); $deletedRows = UserProvider::where(['user_id' => $id, 'provider_id' => $provider_id])->delete(); Alert::add("Social network removed from profile", ["alert_type" => "success"]); return redirect()->route('profile'); }
/** * Find user by provider * * @return app\models\User|null */ private function findUserByProvider() { $profile = $this->client->getUserAttributes(); $id = ArrayHelper::getValue($profile, 'id'); if ($provider = UserProvider::findByProvider($this->type, $id)) { $user = $provider->user; $provider->setAttributes($this->parseProvider()); $provider->save(); return $user; } return null; }
public function testFindByProvider() { expect_that($provider = UserProvider::findByProvider(UserProvider::TYPE_TWITTER, 'twitter-id')); expect($provider->user_id)->equals(2); expect_not(UserProvider::findByProvider(UserProvider::TYPE_TWITTER, 'wrong-id')); }