2016-09-12 12 views
14

रीडायरेक्ट के बाद सत्र नहीं रख सकता है मैं अपने उपयोगकर्ता को लॉग इन करने के लिए फेसबुक PHP एसडीके का उपयोग कर रहा हूं।लार्वेल 5.2 में फेसबुक लॉगिन

मैं इस

के लिए एक गार्ड लॉगिन नामक यहाँ 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' 
    ] 
], 

फेसबुक API एक्सेस करने की मैं अनुप्रयोग \ सेवाओं नाम स्थान में एक वर्ग बनाया यह फेसबुक बुलाया

अनुप्रयोग \ सेवाएं \ 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; 
} 

......... 
} 

लिखना सफल फेसबुक लॉगिन रीडायरेक्ट पर मैं Auth::guard()->login() बुला के बाद बोल रहा हूँ UserController @ fbLogin मैं सत्र डंप इसे सफलतापूर्वक एक login_login_randomstring=>UserId मैं सत्र दिखाने है। लेकिन जब मैं इसे सभी सत्र डेटा खो देता है।

लेकिन अजीब बात यह है कि यह केवल तब होता है जब यह फेसबुक रीडायरेक्ट के माध्यम से कॉल करता है। तो मैं सामान्य लॉगिन मार्गों की तरह इस फ़ंक्शन का उपयोग यह route.php

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

में और UserController

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

में इस

की तरह काम करता है perfactaly पहुँच इस पद्धति का उपयोग करते हुए मैं कर सकता हूँ आसानी से यहां से रीडायरेक्ट करने के बाद सत्र डेटा लेकिन फेसबुक मामले में यह नहीं हो रहा है।

मैं दो दिनों के लिए यहाँ अटक किसी को भी मदद कर सकते हैं तो कृपया मुझे

[नोट: कृपया अपने जवाब है कि मैं वेब मिडलवेयर में मेरे मार्गों वर्गीकृत किया जाना चाहिए में उल्लेख नहीं है। ]

उत्तर

7

लार्वेल में बहुत गहरी खुदाई करने के बाद मुझे अंत में पता चला कि मैं क्या गलत कर रहा था। और मैं पोस्टिंग कर रहा हूं यह भविष्य में कुछ मदद कर सकता है।

महत्वपूर्ण बात: - लैरवेल अपने अनुरोध जीवन चक्र में सत्र को बहुत आखिरी बचाता है। यह सत्र बचाता है यह हेडर प्रतिक्रिया भेजता है। इसलिए यदि हम नियंत्रक वर्ग में कुछ गूंजते हैं तो यह सहेजने के सत्र के बिना हेडर प्रतिक्रिया भेज देगा और हमारा सत्र सहेजा नहीं जाएगा।मेरे मामले में मैं अपने नियंत्रक में dump फ़ंक्शन का उपयोग करता हूं जो लार्वेल डिफ़ॉल्ट जीवन-चक्र को समाप्त करता है और बलपूर्वक ब्राउज़र पर हेडर प्रतिक्रिया भेजता है। यही कारण है कि सभी सत्र डेटा खो गया है। मैं dump() को अपना कोड बना देता हूं और सब ठीक से काम करना शुरू कर देता है

4

API दस्तावेज़ https://laravel.com/api/5.2/Illuminate/Auth/Guard.html के अनुसार आप वर्तमान में प्रमाणित उपयोगकर्ता पाने के लिए user() विधि फोन करना चाहिए। तो मैं सुझाव दूंगा कि Auth::guard() के बजाय Auth::user($user) का उपयोग करें।

+0

मुझे लगता है कि आपने पूरा प्रश्न नहीं पढ़ा है, मैंने कहा है कि सफलतापूर्वक प्रमाणीकरण के बाद मैंने अपना सत्र डेटा खो दिया है और फिर उपयोगकर्ता को दूसरे पृष्ठ पर रीडायरेक्ट कर दिया है। प्रमाणीकृत उपयोगकर्ता प्राप्त करना मेरी समस्या नहीं है। –

+0

क्या आप कृपया जांच सकते हैं कि आप संग्रहण फ़ोल्डर में फ़ाइल करने के लिए 777 अनुमतियां कैसे देते हैं? http://stackoverflow.com/questions/31615462/session-not-saving-in-laravel-5-1 –

4

Laravel सत्र के लिए व्यक्तिगत वर्ग का उपयोग फेसबुक के साथ प्रवेश के लिए प्लगइन सोशलाइट उपयोग करने का प्रयास, socialite

फेसबुक php SDK का उपयोग $ _SESSION.In laravel आप इस चर का उपयोग नहीं कर सकते हैं।

+0

मुझे यह बहुत अच्छा पता है इसलिए मैंने एक कस्टम प्रेसिडेंट डेटा हैंडलर क्लास 'ऐप \ एक्सटेंशन \ फेसबुक \ फेसबुकलार्वार्पर्सिस्टेंटडाटाहैंडलर जोड़ा 'सत्र में डेटा लिखने के लिए जिम्मेदार है। सोशलसाइट का उपयोग करने के बारे में, यह एक अच्छी प्लगइन है लेकिन हम केवल फेसबुक से बहुत ही बुनियादी सेवाएं प्राप्त कर सकते हैं। –

+0

और मैंने पाया कि सत्र ने अपना डेटा क्यों खो दिया है, मेरे उत्तर के लिए मेरा उत्तर –

2

एपीआई कोड और आपके फेसबुक दस्तावेज़ के अनुसार। अनुरोध के साथ काम कर सरल सत्र। आप मूल्य में डाल सत्र के लिए

के साथ अपने डेटा को बचा सकता है

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

मूल्य

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

बहुत उपयोगी बात पुनर्प्राप्त करें अपनी मामले में।

+0

धन्यवाद, लेकिन यह मेरी समस्या नहीं थी। मैं अपने उत्तर में विस्तार से अपनी समस्या का उत्तर समझाता हूं। मेरा जवाब देखें –

संबंधित मुद्दे