2015-05-21 7 views
5

Я работаю с пакетом SammyK/Facebook и сталкиваюсь с проблемой входа в facebook через CSRF. Раньше он работал нормально, но позже мне пришлось отключить защиту CSRF в моем kernel.php для бесперебойной работы API. Теперь я его обновил и добавил следующие строки в промежуточногоОшибка проверки подписи на основе перекрестного запроса. Обязательное условие «состояние» отсутствует. Laravel Sammyk/Facebook package

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 я получаю запрос проверки подлог Межсайтовые не удалось. Обязательное условие «состояние» отсутствует, когда я делаю логин FB. Я пытался отлаживать и находить в FacebookRedirectLoginHelper функция validateCsrf() не получает сохраненное состояние $savedState = $this->persistentDataHandler->get('state');
Я не уверен, как решить это, так как в идеале он должен работать. Я попытался напечатать как состояние $, так и $ savedState, и я получаю $ savedState как null.

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

Наконец, заглянув в FB код, я обнаружил, что проблема «запрошено подтверждение подлога Межсайтового не удалось. Обязательно пары„состояние“отсутствует» и похожести вызваны PHP переменного $ _SESSION [ «FBRLH_state»], что по какой-то «странной» причине, когда FB вызывает файл обратного вызова login.

Чтобы решить эту проблему, я сохраняю эту переменную «FBRLH_state» ПОСЛЕ вызова функции $ helper-> getLoginUrl (...). Очень важно делать только после вызова этой функции из-за того, что внутри этой функции находится переменная $ _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 перед вызовом весь код FB:

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

Где я вызываю код сеанса .... в login.php или войдите-callback.php – deemi

0

Это была моя боль в голове, тогда я нашел простой способ ее исправить.

находка конфигурации/session.php и изменить

'expire_on_close' => false,

в

'expire_on_close' => true,

+2

Я попробовал , и по-прежнему сталкивается с той же ошибкой ** «Ошибка проверки подделки на основе перекрестного запроса. Отсутствие обязательного параметра« состояние »отсутствует.» ** – ihue

1

Для тех, кто использует код воспламенитель, вы должны автозагрузку библиотеку сеанса.

Изменить приложение/Config/autoload.php, библиотеки должны включать 'сессии':

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

В CodeIgniter это работает, спасибо. – user2580401