Я пытаюсь сделать вход в Facebook в Laravel, где он проверяет, есть ли пользователь для входа, если нет, то создает пользователя в БД и затем входит в систему.
Так что для извлечения данныхиз приложения входа в Facebook работает, поскольку оно создает пользователя с правильными данными для моей учетной записи FB в БД.
Однако следующий логин приводит к следующей ошибке:
Аргумент 1 переданIlluminate \ Auth \ SessionGuard :: login () должен реализовывать интерфейс Illuminate \ Contracts \ Auth \ Authenticatable, с нулевым значением, вызываемый в /home/vagrant/code/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php в режиме онлайн307
Немного заглянем в код:
web.php - Маршрутизация
//Socialite (Facebook) routes
Route::get('/fb-login', 'SocialAuthFacebookController@redirectToProvider');
Route::get('/callback', 'SocialAuthFacebookController@handleProviderCallback');
SocialAuthFacebookController.php - Контроллер для аутентификации FB через Socialite
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Socialite;
use App\Services\SocialFacebookAccountService;
class SocialAuthFacebookController extends Controller
{
/**
* Create a redirect method to facebook api.
*
* @return void
*/
public function redirectToProvider()
{
return Socialite::driver('facebook')->stateless()->redirect();
}
/**
* Return a callback method from facebook api.
*
* @return callback URL from facebook
*/
public function handleProviderCallback(SocialFacebookAccountService $service, Request $request)
{
//check if request denied or does not contain valid login info, then redirect back to login
if (!$request->has('code') || $request->has('denied')) {
return redirect('/login');
}
$user = $service->createOrGetUser(Socialite::driver('facebook')->stateless()->user());
Auth::login($user, true);
return redirect()->to('/');
}
}
SocialFacebookAccountService - Служба с функцией поиска или создания учащегося / пользователя в БД.
<?php
namespace App\Services;
use App\User;
use App\Student;
use Laravel\Socialite\Contracts\User as ProviderUser;
class SocialFacebookAccountService
{
public function createOrGetUser(ProviderUser $providerUser)
{
$account = Student::whereFacebookUserId($providerUser->getId())
->first();
if ($account) {
return $account->user;
} else {
$account = new Student([
'facebook_user_id' => $providerUser->getId()
]);
$user = Student::whereEmail($providerUser->getEmail())->first();
if (!$user) {
$user = Student::create([
'facebook_user_id' => $providerUser->getId(),
'email' => $providerUser->getEmail(),
'firstname' => $providerUser->getName(),
'lastname' => $providerUser->getName(),
'password' => md5(rand(1,10000)),
]);
}
$account->user()->associate($user);
$account->save();
return $user;
}
}
}
Student.php - Модель для учащегося
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
protected $fillable = ['id', 'facebook_user_id', 'firstname', 'lastname', 'email', "password"];
public function user()
{
return $this->belongsTo(User::class);
}
}