gpt4 book ai didi

php - 重定向后,laravel 5.2 中的 Facebook 登录无法保持 session

转载 作者:IT王子 更新时间:2023-10-29 00:03:58 29 4
gpt4 key购买 nike

我正在使用 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 的类

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() 我转储 session 后,它成功地显示了一个 login_login_randomstring=>UserId 我的 session 。但是当我重定向它时,所有 session 数据都丢失了。

但奇怪的是,它只在通过 facebook 重定向调用时发生。如果我像正常登录路由一样使用此功能,它实际上会像这样工作

在 route.php 中

Route::get('/login','UserController@login');

在 UserController 中

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

使用这种方法,我可以在从这里重定向后轻松访问 session 数据,但在 facebook 的情况下,它不会发生。

我在这里呆了两天,请任何人帮助我

[注意:请不要在您的回答中提及我应该在网络中间件中对我的路由进行分组。 ]

最佳答案

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

重要的事情:- Laravel 在其请求生命周期的最后保存 session 。它保存发送 header 响应的 session 。因此,如果我们在 Controller 类中回显某些内容,那么它将在不保存 session 的情况下发送 header 响应,并且我们的 session 将不会保存。在我的例子中,我在我的 Controller 中使用了 dump 函数,它终止了 laravel 默认生命周期并强制将 header 响应发送到浏览器。这就是所有 session 数据丢失的原因。我从我的代码中删除了 dump(),一切都开始正常工作了

关于php - 重定向后,laravel 5.2 中的 Facebook 登录无法保持 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39448740/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com