2015-03-02 8 views
6

मैं अपनी परियोजना में सोशलाइट पैकेज को लागू करने की कोशिश कर रहा हूं। यहां मेरा कोड है जो ठीक काम करता है। हालांकि, यदि उपयोगकर्ता लॉग आउट करने के लिए लॉग इन करने का प्रयास करता है तो यह डेटाबेस में डुप्लिकेट प्रविष्टि करता है। इसके अलावा मुझे उपयोगकर्ता का सार्वजनिक नाम $ userData-> नाम से नहीं मिल सकता है। यह शून्य आता है।लैरवेल सोशलाइट Google रजिस्टर और लॉगिन

यहां मेरा नियंत्रक है;

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'); 
} 

मेरा उपयोगकर्ता भंडार;

namespace App\Repositories; 
use App\User; 


class UserRepository { 


public function findByUsernameOrCreate($userData) 
{ 

    return User::firstOrCreate([ 
     'username' => $userData->name, 
     'email' => $userData->email, 

    ]); 

} 
} 

उपयोगकर्ता कक्षा प्रमाणीकृत;

<?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(); 

} 



} 

उत्तर

1

मैं आप यहां क्या है करने के लिए बहुत समान कोड का उपयोग करके यह काम कर प्राप्त करने में सक्षम किया गया है को छोड़कर मैं अपने UserRepository में findByUsernameOrCreate विधि संशोधित कर लिया है। मैं एक syncUserDetails विधि है कि इस तरह दिखता है बनाया:

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'] 
    ]); 
} 

यह जाँच करता है कि क्या कोई उपयोगकर्ता एक मिलान ईमेल के साथ DB में पहले से ही है:

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

और अगर ऐसा है, तो यह ऊपर से मेल खाता के साथ नया डेटा और एक उपयोगकर्ता देता है।

आशा है कि इससे मदद मिलती है!

संबंधित मुद्दे