Laravel Socialite: пользователь Facebook создан в БД, но логин еще не работает - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь сделать вход в 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);
    }

}
...