2015-05-21 6 views
5

मैं सैमीके/फेसबुक पैकेज के साथ काम कर रहा हूं और सीएसआरएफ पर फेसबुक लॉगिन के साथ एक समस्या का सामना कर रहा हूं। इससे पहले यह ठीक काम करता था, लेकिन बाद में मुझे एपीआई के सुचारु काम के लिए मेरे kernel.php में सीएसआरएफ सुरक्षा को अक्षम करना पड़ा। अब मैं इसे अद्यतन और मिडलवेयरक्रॉस-साइट अनुरोध फर्जी सत्यापन विफल रहा। आवश्यक पैरा "राज्य" गायब लैरावेल सैमिक/फेसबुक पैकेज

public function handle($request, Closure $next) { 
    $skip = array(
       'api/v1/signup', 
       'api/v1/login', 
       'api/v1/addContacts', 
       'api/v1/email' 
      ); 
    foreach ($skip as $key => $route) { 
     //skip csrf check on route 
     if($request->is($route)){ 
      return parent::addCookieToResponse($request, $next($request)); 
     } 
    } 
    return parent::handle($request, $next); 
    } 

में नीचे लाइनों को शामिल किया है तो यह वेब और एपीआई अपेक्षा के अनुरूप काम करने के लिए अनुमति देता है, लेकिन जब से मैं CSRF अक्षम कर दिया था मैं क्रॉस-साइट अनुरोध जालसाजी सत्यापन में विफल मिलता है। जब मैं एफबी लॉगिन करता हूं तो आवश्यक पैरा "राज्य" गायब त्रुटि। मैंने फेसबुक रीडरेक्ट लॉजिइन हेल्पर में डीबग करने और पाया कि फंक्शन validateCsrf() सहेजे गए नहीं हैं $savedState = $this->persistentDataHandler->get('state');
मुझे यकीन नहीं है कि इसे कैसे हल किया जाए, आदर्श रूप में इसे अभी काम करना चाहिए। मैंने $ राज्य और $ सहेजे गए दोनों को मुद्रित करने की कोशिश की है और मुझे $ saveState शून्य के रूप में

class FacebookController extends Controller { 
    public function fbConnect(LaravelFacebookSdk $fb) 
    { 
     // Obtain an access token. 
    try { 
    $token = $fb 
     ->getRedirectLoginHelper() 
     ->getAccessToken(); 
    } catch (Facebook\Exceptions\FacebookSDKException $e) { 
      dd($e->getMessage()); 
    } 
    // Access token will be null if the user denied the request 
    // or if someone just hit this URL outside of the OAuth flow. 
if (! $token) { 
    // Get the redirect helper 
$helper = $fb->getRedirectLoginHelper(); 

    if (! $helper->getError()) { 
     abort(403, 'Unauthorized action.'); 
    } 

    // User denied the request 
    dd(
     $helper->getError(), 
     $helper->getErrorCode(), 
     $helper->getErrorReason(), 
     $helper->getErrorDescription() 
    ); 
    } 

उत्तर

6

अंत में, अमेरिकन प्लान कोड में देख, मुझे पता चला "। क्रॉस-साइट अनुरोध जालसाजी सत्यापन में विफल आवश्यक परम" है कि समस्या राज्य "लापता" और समानता पीएचपी चर $ _SESSION [ 'FBRLH_state'] के कारण होता है कि कुछ "अजीब" कारणों के लिए जब एफबी लॉगिन-कॉलबैक फ़ाइल को कॉल करता है।

इसे हल करने के लिए मैं फ़ंक्शन $ हेल्पर-> getLoginUrl (...) के कॉल के बाद इस चर "FBRLH_state" को संग्रहीत करता हूं। इस फ़ंक्शन के अंदर होने के कारण केवल इस फ़ंक्शन के कॉल के बाद ही करना बहुत महत्वपूर्ण है जब परिवर्तनीय $ _SESSION ['FBRLH_state'] आबादी है।

login.php में मेरी कोड का एक उदाहरण नीचे:

$uri=$helper->getLoginUrl($uri, $permissions); 
foreach ($_SESSION as $k=>$v) {      
    if(strpos($k, "FBRLH_")!==FALSE) { 
     if(!setcookie($k, $v)) { 
      //what?? 
     } else { 
      $_COOKIE[$k]=$v; 
     } 
    } 
} 
var_dump($_COOKIE); 

और प्रवेश-callback.php में सभी अमेरिकन प्लान कोड कॉल करने से पहले:

foreach ($_COOKIE as $k=>$v) { 
    if(strpos($k, "FBRLH_")!==FALSE) { 
     $_SESSION[$k]=$v; 
    } 
} 

अंतिम, लेकिन कम से कम, PHP सत्र के लिए कोड भी शामिल करना याद रखें ..

if(!session_id()) { 
    session_start(); 
} 
... 
... 
... 
... 
<?php session_write_close() ?> 

मुझे आशा है कि यह प्रतिक्रिया आपको 8-10 घंटे के काम को बचाने में मदद कर सकती है :) अलविदा, एलेक्स।

+2

कहाँ मैं सत्र कोड फोन .... या लॉगिन-callback.php – deemi

0

यह मेरा सिर दर्द था, फिर मुझे इसे ठीक करने का एक आसान तरीका मिला।

खोज config/session.php और बदल

'expire_on_close' => false,

को

'expire_on_close' => true,

+2

मैंने कोशिश की है कि , और अभी भी एक ही त्रुटि का सामना करना पड़ रहा है ** "क्रॉस-साइट अनुरोध फर्जी सत्यापन विफल रहा। आवश्यक पैरा" राज्य "गायब।" ** – ihue

1

जो लोग कोड आग लगनेवाला का उपयोग कर रहे हैं के लिए, आप autoload को सत्र पुस्तकालय होगा।

आपके आवेदन/config/autoload.php बदलें, पुस्तकालयों 'सत्र' शामिल करना चाहिए: login.php में

$autoload['libraries'] = array('session'); 
+0

कोडइग्निटर में यह काम करता है, धन्यवाद। – user2580401

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