2017-08-10 127 views
0

我有使用Laravel交際花的一個問題,下面的代碼:Laravel Socialite不工作?

class SocialAuthController extends Controller 
{ 
    public function redirect($provider) { 
     return Socialite::driver($provider)->redirect();  
    } 
    public function callback(SocialAccountService $service, $provider) { 
     $user = $service->createOrGetUser(Socialite::driver($provider)); 
     auth()->login($user, true); 
     return redirect()->to('/'); 
    } 
} 

SocialAccountService:

public function createOrGetUser(Provider $provider) 
{ 
    $providerUser = $provider->user(); 
    $providerName = class_basename($provider); 
    $account = SocialAccount::whereProvider($providerName) 
     ->whereProviderUserId($providerUser->getId()) 
     ->first(); 
    if ($account) { 
     return $account->user; 
    }else{ 
     $account = new SocialAccount([ 
      'provider_user_id' => $providerUser->getId(), 
      'provider' => $providerName 
     ]); 
     $user = User::whereEmail($providerUser->getEmail())->first(); 
     if (!$user) { 
      $user = User::create([ 
       'email' => $providerUser->getEmail(), 
       'name' => $providerUser->getName(), 
       'avatar' => $providerUser->getAvatar(), 
      ]); 
     } 
     $account->user()->associate($user); 
     $account->save(); 
     return $user; 
    } 
} 

現在我收到的問題是:

FatalThrowableError Type error: Argument 1 passed to Illuminate\Auth\SessionGuard::login() must implement interface Illuminate\Contracts\Auth\Authenticatable, null given, called in /var/www/liveandnow/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 294

誰能解釋我做錯了什麼?因爲我看不出有什麼問題,在這裏我的代碼

錯誤

(1/1) InvalidStateException 

in AbstractProvider.php (line 209) 
at AbstractProvider->user() 
in SocialAccountService.php (line 11) 
at SocialAccountService->createOrGetUser(object(GoogleProvider)) 
in SocialAuthController.php (line 18) 
at SocialAuthController->callback(object(SocialAccountService), 'google') 
at call_user_func_array(array(object(SocialAuthController), 'callback'), array(object(SocialAccountService), 'provider' => 'google')) 
in Controller.php (line 55) 
at Controller->callAction('callback', array(object(SocialAccountService), 'provider' => 'google')) 
in ControllerDispatcher.php (line 44) 
at ControllerDispatcher->dispatch(object(Route), object(SocialAuthController), 'callback') 
in Route.php (line 203) 
at Route->runController() 
in Route.php (line 160) 
at Route->run() 
in Router.php (line 574) 
at Router->Illuminate\Routing\{closure}(object(Request)) 
in Pipeline.php (line 30) 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
in SubstituteBindings.php (line 41) 
at SubstituteBindings->handle(object(Request), object(Closure)) 
in Pipeline.php (line 148) 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
in Pipeline.php (line 53) 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
in VerifyCsrfToken.php (line 65) 
at VerifyCsrfToken->handle(object(Request), object(Closure)) 
in Pipeline.php (line 148) 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
in Pipeline.php (line 53) 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
in ShareErrorsFromSession.php (line 49) 
at ShareErrorsFromSession->handle(object(Request), object(Closure)) 
in Pipeline.php (line 148) 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
in Pipeline.php (line 53) 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
in StartSession.php (line 64) 
at StartSession->handle(object(Request), object(Closure)) 
in Pipeline.php (line 148) 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
in Pipeline.php (line 53) 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
in AddQueuedCookiesToResponse.php (line 37) 
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) 
in Pipeline.php (line 148) 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
in Pipeline.php (line 53) 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
in EncryptCookies.php (line 59) 
at EncryptCookies->handle(object(Request), object(Closure)) 
in Pipeline.php (line 148) 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
in Pipeline.php (line 53) 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
in Pipeline.php (line 102) 
at Pipeline->then(object(Closure)) 
in Router.php (line 576) 
at Router->runRouteWithinStack(object(Route), object(Request)) 
in Router.php (line 535) 
at Router->dispatchToRoute(object(Request)) 
in Router.php (line 513) 
at Router->dispatch(object(Request)) 
in Kernel.php (line 176) 
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) 
in Pipeline.php (line 30) 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
in TransformsRequest.php (line 30) 
at TransformsRequest->handle(object(Request), object(Closure)) 
in Pipeline.php (line 148) 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
in Pipeline.php (line 53) 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
in TransformsRequest.php (line 30) 
at TransformsRequest->handle(object(Request), object(Closure)) 
in Pipeline.php (line 148) 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
in Pipeline.php (line 53) 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
in ValidatePostSize.php (line 27) 
at ValidatePostSize->handle(object(Request), object(Closure)) 
in Pipeline.php (line 148) 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
in Pipeline.php (line 53) 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
in CheckForMaintenanceMode.php (line 46) 
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) 
in Pipeline.php (line 148) 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
in Pipeline.php (line 53) 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
in Pipeline.php (line 102) 
at Pipeline->then(object(Closure)) 
in Kernel.php (line 151) 
at Kernel->sendRequestThroughRouter(object(Request)) 
in Kernel.php (line 116) 
at Kernel->handle(object(Request)) 
in index.php (line 53) 

回答

0

auth()->login()你必須提供App\User模型的實例,但不是說,要傳遞null值。

這裏是你正在尋找(測試)的代碼:

public function redirectToProvider($provider) 
{ 
    return Socialite::driver($provider)->redirect(); 
} 

public function handleProviderCallback($provider) 
{ 
     $socialMediaUser = Socialite::driver($provider)->user(); 

     $user = $this->findOrCreateUser($socialMediaUser); 

     auth()->login($user); 

     return redirect()->route('home'); 
} 

public function findOrCreateUser($socialMediaUser) 
{ 
    $user = User::where('social_provider_id', $socialMediaUser->getId())->first(); 

    if(is_null($user)) { 
     $user = User::create([ 
      'social_provider_id' => $socialMediaUser->getId(), 
      'name' => $socialMediaUser->getName(), 
      'email' => $socialMediaUser->getEmail(), 
      'avatar' => $socialMediaUser->getAvatar() 
     ]); 
    } 

    return $user; 
} 

完整的源代碼:

https://github.com/xparthxvorax/Laravel-Socialite

注:

Twitter的不提供用戶的電子郵件,所以這不適用於Twitter:

$user = User::whereEmail($providerUser->getEmail())->first(); 
+0

但我的代碼幾乎是完全一樣的,這是以前的工作,突然就停止工作 –

+0

那麼問題可能是與您正在使用的社會服務提供商?你在使用哪一個?在回調函數print dd(Socialite :: driver($ provider) - > user())中顯示輸出。 –

+0

我得到的東西像tihs:在SocialAccountService-(1/1)InvalidStateException 在AbstractProvider.php(線209) 在AbstractProvider->用戶() 在SocialAccountService.php(第11行) > createOrGetUser(對象(GoogleProvider )) 在SocialAuthController.php(第18行) at SocialAuthController-> callback(object(SocialAccountService),'google') –