2016-09-12 12 views
14

Facebook PHP SDKを使用してユーザーをログしています。laravelのFacebookログインはリダイレクト後にセッションを保持できません

私はここでは、この

のログインと呼ばれるガードを作成したが、FacebookのAPIにアクセスするauth.phpの私のconfigファイル

'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' 
    ] 
], 

である私は、App \サービス名前空間内のクラスを作成した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'); 
} 

} 

そして、ここでは、私は私がそれに成功login_login_randomstring=>UserId私のセッションを表示するセッションをダンプAuth::guard()->login()を呼び出した後UserControllerで@ fbLogin を呼び出しています成功したFacebookのログインリダイレクトで私のログインロジック

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; 
} 

......... 
} 

を書く私のUserControllerです。しかし、リダイレクトすると、すべてのセッションデータが失われます。

しかし、奇妙なことは、それがフェイスブックリダイレクトを呼び出すときにのみ起こることです。私は通常のログインルートのように、この機能を使用する場合、それは私が簡単にアクセスできるこの方法を使用するroute.php

Route::get('/login','[email protected]'); 

とUserControllerで

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

でこの

ようperfactaly作品ここからリダイレクトした後のセッションデータですが、それは起こっていません。

私は誰もが私に

を助けることができますしてください2日間ここで立ち往生[注:私は、Webミドルウェアで私のルートをグループ化する必要があることあなたの答えには言及しないでください。 ]

答えて

7

私は最終的に私が間違っていたものを見つけました。私はそれが将来的にいくつかの助けになるかもしれないと投稿しています。

重要なこと: - Laravelセーブセッションは、要求ライフサイクルの最後にあります。それはヘッダー応答を送るセッションを保存します。したがって、コントローラクラスに何かをエコーすると、セッションを保存せずにヘッダレスポンスを送信し、セッションは保存されません。私の場合、私のコントローラには、laravelのデフォルトのライフサイクルを終了させ、強制的にヘッダレスポンスをブラウザに送信するコントローラのdump機能を使用します。そのためセッションデータがすべて失われてしまいます。私はdump()フォームを削除してください。すべてのコードが正常に動作し始めます。

4

APIドキュメントhttps://laravel.com/api/5.2/Illuminate/Auth/Guard.htmlによれば、現在認証されているユーザーを取得するには、user()メソッドに電話する必要があります。だから私はAuth::guard()の代わりにAuth::user($user)を使用することをお勧めします。

+0

あなたは完全な質問を読んでいないと思います。セッションのデータが失われ、正常に認証された後、ユーザーを別のページにリダイレクトしたとします。認証されたユーザーを取得することはまったく問題ではありません。 –

+0

ストレージフォルダにファイルを保存する方法を確認してください。 http://stackoverflow.com/questions/31615462/session-not-saving-in-laravel-5-1 –

4

は、セッションのための個人的なクラスを使用laravel、socialite

のFacebookのPHP SDKを使用する$ _SESSION.Inのlaravelあなたはこの変数にアクセスすることはできませんログインfacebookでログインのためのプラグイン社交界の名士を使用するようにしてください。

+0

私はそれをよく知っています。なぜなら、カスタムの既存のデータハンドラクラス 'App \ Extensions \ Facebook \ FacebookLaravelPersistentDataHandlerセッションにデータを書き込む責任があります。 Socialiteの使い方については、良いプラグインですが、それだけでFacebookの基本サービスを得ることができます。 –

+0

と私はセッションがデータを失った理由を見つけた私の答え –

2

apiコードとあなたのFacebookの文書によると、要求を処理するシンプルなセッション。あなたは

Session::put('userid','1'); 

はあなたのケースで値

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

非常に便利なものを取得した値でプット・セッションについて

を使用してデータを保存することができます。

+0

あなたの答えをありがとうが、これは私の問題ではなかった。私は私の答えの中で私の問題の答えを詳細に説明します。私の答えを見る –

関連する問題