Php 在laravel 5.2中登录Facebook可以';在重定向后,无法保持会话
我正在使用Facebook PHP SDK记录我的用户 我为此创建了一个名为login的防护 这是我的auth.php配置文件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' =>
'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获得非常基本的服务。我发现了会话丢失数据的原因,请查看我的回答谢谢你的回答,但这不是我的问题。我在回答中详细解释了问题的答案。看到我的答案了吗