Php 在laravel 5.2中登录Facebook可以';在重定向后,无法保持会话

Php 在laravel 5.2中登录Facebook可以';在重定向后,无法保持会话,php,facebook-graph-api,laravel-5.2,facebook-php-sdk,Php,Facebook Graph Api,Laravel 5.2,Facebook Php Sdk,我正在使用Facebook PHP SDK记录我的用户 我为此创建了一个名为login的防护 这是我的auth.php配置文件 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' =>

我正在使用Facebook 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'
    ]
],
<?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');
}

}
为了访问Facebook api,我在App\services名称空间中创建了一个名为Facebook的类

App\Services\Facbook.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'
    ]
],
<?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');
}

}
在成功登录Facebook后,我将拨打重定向电话UserController@fbLogin 调用
Auth::guard()->login()
i dump会话后,它成功显示
login\u login\u randomstring=>UserId
i会话。但当我重定向它时,所有会话数据都丢失了

但奇怪的是,它只有在通过facebook重定向调用时才会发生。如果我像普通登录路由一样使用这个函数,它的工作原理实际上是这样的

在route.php中

Route::get('/login','UserController@login');
和用户控制器中的

function login(){
 $user = User::find(12);
 Auth::guard('login')->login($user);
 return redirect('/');
}
使用这种方法,我可以很容易地访问会话数据重定向后,从这里,但在facebook的情况下,它不会发生

我在这里呆了两天,有人能帮我吗


[注意:请不要在回答中提到我应该在web中间件中对路由进行分组。]

根据API文档
https://laravel.com/api/5.2/Illuminate/Auth/Guard.html
您应该调用
user()
方法来获取当前经过身份验证的用户。因此我建议使用
Auth::user($user)
,而不是
Auth::guard()

尝试使用社交插件登录facebook


Facebook php sdk使用$_SESSION。在laravel中,您无法访问此变量,laravel使用个人类进行会话。

在深入研究laravel后,我终于发现了我做错了什么。我现在发布的帖子可能会对将来有所帮助


重要事项:-Laravel保存会话是其请求生命周期中的最后一个会话。它保存会话并发送头响应。所以,若我们回显控制器类中的某个内容,那个么它将发送头响应而不保存会话,并且会话将不会保存。在我的情况下,我在控制器中使用
dump
功能,该功能终止laravel默认生命周期,并强制向浏览器发送标题响应。这就是所有会话数据丢失的原因。我从代码中删除了
dump()
,根据api代码和您的facebook文档,一切都开始正常工作。处理请求的简单会话。您可以使用

用于将会话放入值中

Session::put('userid','1');
检索值

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

在您的情况下非常有用。

我想您没有阅读完整的问题,我说我在成功验证后丢失了会话数据,然后将用户重定向到另一个页面。获取经过身份验证的用户根本不是我的问题。您能检查一下如何授予777权限以在存储文件夹中归档吗?我很清楚这就是为什么我添加了一个定制的现有数据处理程序类
App\Extensions\Facebook\Facebook\laravelpersistentdatahandler
,它负责将数据写入会话。关于使用社交名媛,这是一个很好的插件,但我们只能从facebook获得非常基本的服务。我发现了会话丢失数据的原因,请查看我的回答谢谢你的回答,但这不是我的问题。我在回答中详细解释了问题的答案。看到我的答案了吗