Sign up and log in to Laravel Socialite Google

I am trying to implement the Socialite package in my project. Here is my code that works great. However, it duplicates the record in the database, if the user logs out, tries to log in. Also, I cannot get a public username with the name $ userData->. It returns null.

Here is my controller;

namespace App\Http\Controllers; use App\AuthenticateUser; use App\AuthenticateUserListener; use App\Http\Requests; use Illuminate\Http\Request; class SocialLoginsController extends Controller implements AuthenticateUserListener { /** * @param AuthenticateUser $authenticateUser * @param Request $request * @return \Symfony\Component\HttpFoundation\RedirectResponse */ public function socialLogin(AuthenticateUser $authenticateUser, Request $request) { $hasCode = $request->has('code'); return $authenticateUser->execute($hasCode, $this); } /** * When a user has successfully been logged in... * * @param $user * @return \Illuminate\Routing\Redirector */ public function userHasLoggedIn($user) { return redirect('student'); } 

My custom repository;

 namespace App\Repositories; use App\User; class UserRepository { public function findByUsernameOrCreate($userData) { return User::firstOrCreate([ 'username' => $userData->name, 'email' => $userData->email, ]); } } 

User Class Authentication;

 <?php namespace App; use Illuminate\Contracts\Auth\Guard; use App\Repositories\UserRepository; use Laravel\Socialite\Contracts\Factory as Socialite; class AuthenticateUser { /** * @var UserRepository */ private $users; /** * @var Socialite */ private $socialite; /** * @var Guard */ private $auth; /** * @param UserRepository $users * @param Socialite $socialite * @param Guard $auth */ public function __construct(UserRepository $users, Socialite $socialite, Guard $auth) { $this->users = $users; $this->socialite = $socialite; $this->auth = $auth; } /** * @param boolean $hasCode * @param AuthenticateUserListener $listener * @return \Symfony\Component\HttpFoundation\RedirectResponse */ public function execute($hasCode, AuthenticateUserListener $listener) { if ( ! $hasCode) return $this->getAuthorizationFirst(); elseif($hasCode) { $user = $this->users->findByUsernameOrCreate($this->getGoogleUser()); $this->auth->login($user, true); return $listener->userHasLoggedIn($user); } } /** * @return \Symfony\Component\HttpFoundation\RedirectResponse */ private function getAuthorizationFirst() { return $this->socialite->driver('google')->redirect(); } /** * @return \Laravel\Socialite\Contracts\User */ private function getGoogleUser() { return $this->socialite->driver('google')->user(); } } 
+6
source share
1 answer

I managed to get this working using the very similar code that you are here, except that I changed the findByUsernameOrCreate method in your UserRepository . I created a syncUserDetails method that looks like this:

 public function syncUserDetails($userData) { if ( $user = $this->userRecordExists($userData) ) { $user->token = $userData->token; $user->google_id = $userData->id; $user->name = $userData->name; $user->avatar = $userData->avatar; $user->first_name = $userData->user['name']['givenName']; $user->last_name = $userData->user['name']['familyName']; $user->save(); return $user; } return $this->user->firstOrCreate([ 'email' => $userData->email, 'token' => $userData->token, 'google_id' => $userData->id, 'name' => $userData->name, 'avatar' => $userData->avatar, 'first_name' => $userData->user['name']['givenName'], 'last_name' => $userData->user['name']['familyName'] ]); } 

It checks if the user already has a corresponding email address in db:

 private function userRecordExists($userData) { return $this->user->where('email', $userData->email)->first(); } 

and if so, it will match it with the new data and return the user.

Hope this helps!

+1
source

Source: https://habr.com/ru/post/983233/


All Articles