我正在使用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'
]
],
访问Facebook api我在App \ services命名空间中创建了一个名为Facebook的类
应用\服务\ 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()
i转储会话后,它成功显示login_login_randomstring=>UserId
i会话。但是当我重定向它时,所有会话数据都丢失了。
但奇怪的是它只会在通过facebook重定向调用时才会发生。如果我像普通的登录路线一样使用这个功能,那就像这样
在route.php中
Route::get('/login','UserController@login');
并在UserController中
function login(){
$user = User::find(12);
Auth::guard('login')->login($user);
return redirect('/');
}
使用此方法,我可以在从此处重定向后轻松访问会话数据,但在facebook情况下,它不会发生。
我在这里呆了两天,任何人都可以帮助我
[注意:请不要在你的回答中提到我应该将我的路线分组到网络中间件中。 ]
答案 0 :(得分:9)
在深入挖掘后,我终于发现了我做错了什么。我发帖可能会对将来有所帮助。
重要的是: - Laravel在其请求生命周期中保存会话。它保存会发送标头响应的会话。因此,如果我们在控制器类中回显一些内容,那么它将发送头响应而不进行保存会话,我们的会话将不会保存。在我的情况下,我在我的控制器中使用text-area
函数来终止laravel默认生命周期并强制向浏览器发送标头响应。这就是所有会话数据丢失的原因。我从我的代码中移除dump
,一切都开始正常工作
答案 1 :(得分:5)
根据API文档https://laravel.com/api/5.2/Illuminate/Auth/Guard.html
,您应该调用user()
方法来获取当前经过身份验证的用户。所以我建议使用Auth::guard()
而不是Auth::user($user)
。
答案 2 :(得分:4)
尝试使用插件社交网站登录facebook socialite
Facebook php sdk使用$ _SESSION.In laravel你无法访问这个变量,laravel使用个人类进行会话。
答案 3 :(得分:2)
根据api代码和你的facebook文档。简单会话处理请求。您可以使用
保存数据用于放置会话值
Session::put('userid','1');
检索值
$request->session()->get('userid') //or
{!! Session::get('userid') !!}
在你的情况下非常有用。