Вход в Facebook в laravel 5.2 не может провести сеанс после перенаправления

Я использую PHP PHP SDK для регистрации моего пользователя.

Я создал охранник под названием login для этого

Вот мой конфигурационный файл auth.php

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
    'admin'=>[
        'driver'=>'session',
        'provider'=>'adminusers',
    ],
    'verify'=>[
        'driver'=>'session',
        'provider'=>'verify',
    ],
    'login'=>[
        'driver'=>'session',
        'provider'=>'users'
    ]
],

для доступа к Facebook api я создал класс в пространстве имен приложений \services, назвав его Facebook

App\Services\Facbook.php

<?php
namespace App\Services;

use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Config;

use App\Extensions\Facebook\FacebookLaravelPersistentDataHandler; 
use Facebook\Facebook as FB;
use App;

class Facebook{

protected $fb;

protected $helper;

protected $permission;

protected $log;

protected $canvashelper;

protected $persistentDataHandler;

function __construct()
{
    $this->fb   =   new FB([
                    'app_id'=>Config::get('facebook.app_id'),
                    'app_secret'=>Config::get('facebook.app_secret'),
                    'default_graph_version' => Config::get('facebook.default_graph_version'),
                    'persistent_data_handler' => new FacebookLaravelPersistentDataHandler(),
                    ]);

    $this->helper = $this->fb->getRedirectLoginHelper();

    $this->permission = Config::get('facebook.permission');

    $this->log = new Logging(Config::get('facebook.logfile'),'Facebook Log');

    $this->canvashelper =   $this->fb->getCanvasHelper();

    $this->persistentDataHandler = new FacebookLaravelPersistentDataHandler();
}

public function FBAuthUrl()
{
    if($this->isFBAuth())
    {
        return $this->helper->getLogoutUrl($this->persistentDataHandler->get('facebook_access_token'),route('facebook.logout'));
    }
    else
    {
        return $this->helper->getLoginUrl(route('facebook.callback'),$this->permission);
    }
}

public function LoginCallback()
{           
    $accessToken = $this->helper->getAccessToken(); 
    if(isset($accessToken))
    {   
        $this->persistentDataHandler->set('facebook_access_token',(string) $accessToken);
    }

}

public function isFBAuth()
{
    return $this->persistentDataHandler->has('facebook_access_token');
}

public function getFBUser()
{
    if($this->isFBAuth())
    {
        $this->fb->setDefaultAccessToken($this->persistentDataHandler->get('facebook_access_token'));
        /*,user_birthday,user_tagged_places*/
        $response = $this->fb->get("/me?fields=id,name,first_name,last_name,age_range,link,gender,locale,picture,timezone,updated_time,verified,email");
        return $response->getGraphUser();
    }
    else
    {
        return false;
    }
}

public function logout()
{
    $this->persistentDataHandler->delete('facebook_access_token');
    $this->persistentDataHandler->delete('state');
}

}

И вот мой UserController Где я пишу логин логина

    class UserController extends Controller
{
    .....
/*
 * Facebook login callback function
 * @param Object App\services\Facebook
 * return redirect
 */

public function fbLogin(Facebook $facebook)
{
    $facebook->LoginCallback();

    /*
     * get the usergraphnode from facebook
     */
    $fbUser = $facebook->getFBUser();

    /*
     * Convert UserGraphNode User To Eloquent User
     */
    $user = $this->getFBLoggedUser($fbUser);        

    /*
     * Here Log the user in laravel System
     */
    Auth::guard('login')->login($user);
    //dump(Auth::guard($this->guard)->user());
    dump(session()->all());
    return reidrect('/');
}


public function getFBLoggedUser($fbUser)
{
    if(User::where('email','=',$fbUser->getField('email'))->count())
    {
        $user = User::where('email','=',$fbUser->getField('email'))->first();
        if($user->fb_app_id){
            $user->fb_app_id = $fbUser->getField('id');
            $user->save();
        }
    }
    else
    {
        $user = $this->FBregister($fbUser);
    }
    return $user;
}


/**
 * Register The user logged in from Facebook
 *
 * @param \Facebook\GraphNodes\GraphUser;
 * 
 * return  \App\Models\User
 */
public function FBregister($fbUser)
{
    $user = new User();
    $user->fname = $fbUser->getField('first_name');
    $user->lname = $fbUser->getField('last_name');
    $user->gender = $fbUser->getField('gender');
    $user->email = $fbUser->getField('email');
    $user->fb_app_id = $fbUser->getField('id');

    $picture = $fbUser->getField('picture');
    if($picture->isSilhouette()){
        $user->profile_image = $picture->getUrl();
    }

    $user->save();

    return $user;
}

.........
}

При успешном переадресации имени пользователя Facebook я вызываю UserController @fbLogin после вызова Auth::guard()->login() я dump session успешно показывает сеанс login_login_randomstring=>UserId i. но когда я перенаправляю все потерянные данные сеанса.

Но странно то, что это происходит только тогда, когда он вызывает перенаправление через facebook. Если я использую эту функцию, как обычные логин-логин, она работает с перфорацией, как это

в route.php

Route::get('/login','[email protected]');

и в UserController

function login(){
 $user = User::find(12);
 Auth::guard('login')->login($user);
 return redirect('/');
}

Используя этот метод, я могу легко получить доступ к данным сеанса после перенаправления отсюда, но в случае с facebook этого не происходит.

Я застрял здесь в течение двух дней, пожалуйста, кто-нибудь может мне помочь.

[Примечание. Пожалуйста, не упоминайте в своем ответе, что я должен сгруппировать свои маршруты в веб-промежуточном программном обеспечении. ]

Ответы

Ответ 1

После глубокого рытья в laravel я наконец нашел то, что я делал неправильно. И я публикую, может быть, это поможет некоторым в будущем.

Важная вещь: - Laravel сохраняет сеанс очень долго в своем жизненном цикле запроса. Он сохраняет сеанс, отправляет ответ заголовка. Поэтому, если мы повторим что-то в классе контроллера, тогда он отправит ответ заголовка, не делая сохранение сеанса, и наш сеанс не будет сохранен. В моем случае я использую функцию dump в моем контроллере, которая завершает жизненный цикл по умолчанию laravel и принудительно передает ответ заголовка в браузер. что все данные сеанса теряются. я удаляю dump() форму моего кода, и все начинает работать правильно

Ответ 2

В соответствии с документацией API https://laravel.com/api/5.2/Illuminate/Auth/Guard.html вы должны вызвать метод user() для получения текущего пользователя, прошедшего проверку подлинности. Поэтому я бы предположил, что вместо Auth::guard() используйте Auth::user($user).

Ответ 3

попробуйте использовать плагин-socialite для входа в facebook socialite

Facebook php sdk use $_SESSION.In laravel, вы не можете получить доступ к этой переменной, laravel использует личный класс для сеанса.

Ответ 4

В соответствии с кодом api и вашей документации в facebook. Простой сеанс работы с запросом. Вы можете сохранить свои данные с помощью

Для ввода сеанса в значение

Session::put('userid','1');

Получить значение

$request->session()->get('userid')  //or
   {!! Session::get('userid') !!}

Очень полезная вещь в вашем случае.