Facebook登录laravel 5.2无法在重定向后保持会话

时间:2016-09-12 10:55:26

标签: 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' => '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情况下,它不会发生。

我在这里呆了两天,任何人都可以帮助我

[注意:请不要在你的回答中提到我应该将我的路线分组到网络中间件中。 ]

4 个答案:

答案 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') !!}

在你的情况下非常有用。