2015-05-21 18 views
5

Tôi đang làm việc với gói SammyK/Facebook và gặp vấn đề với đăng nhập facebook trên CSRF. Trước đó nó hoạt động tốt, nhưng sau đó tôi phải vô hiệu hóa bảo vệ CSRF trong kernel.php của tôi để làm việc trơn tru cho API. Bây giờ tôi có nó được cập nhật và bổ sung các dòng dưới đây trong middlewareXác thực giả mạo yêu cầu chéo trang không thành công. Yêu cầu "trạng thái" thiếu gói Laravel Sammyk/Facebook

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

Vì vậy, điều này cho phép web và api để làm việc như mong đợi, nhưng kể từ khi tôi đã vô hiệu hóa CSRF tôi nhận được cross-site yêu cầu xác nhận giả mạo thất bại. Yêu cầu "trạng thái" thiếu lỗi khi tôi đăng nhập FB. Tôi đã cố gắng để gỡ lỗi và tìm thấy trong các FacebookRedirectLoginHelper chức năng validateCsrf() không nhận được savedstate $savedState = $this->persistentDataHandler->get('state'); Tôi không chắc chắn làm thế nào để giải quyết điều này là lý tưởng nó nên làm việc ngay bây giờ.Tôi đã cố gắng in cả $ state và $ savedState và tôi nhận được $ savedState là 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() 
    ); 
    } 

Trả lời

6

Cuối cùng, nhìn vào mã FB, tôi phát hiện ra rằng vấn đề "Cross-site xác nhận yêu cầu giả mạo thất bại. Yêu cầu param‘trạng thái’mất tích" và similars là do PHP biến $ _SESSION [ 'FBRLH_state'] mà đối với một số lý do "lạ" khi FB gọi tập tin gọi lại đăng nhập.

Để giải quyết, tôi lưu trữ biến này "FBRLH_state" SAU cuộc gọi hàm $ helper-> getLoginUrl (...). Rất quan trọng để làm chỉ sau khi cuộc gọi của chức năng này do là bên trong chức năng này khi biến $ _SESSION ['FBRLH_state'] được điền.

Dưới đây là một ví dụ về mã của tôi trong 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); 

Và trong lần đăng nhập-callback.php trước khi gọi tất cả các mã FB:

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

Cuối cùng nhưng không kém, hãy nhớ cũng bao gồm mã cho phiên PHP vì vậy ..

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

Tôi hy vọng phản hồi này có thể giúp bạn tiết kiệm 8-10 giờ làm việc :) Tạm biệt, Alex.

+2

đâu tôi gọi mã phiên .... trong login.php hoặc đăng nhập-callback.php – deemi

0

Đây là cơn đau đầu của tôi, sau đó tôi tìm thấy một cách dễ dàng để sửa chữa nó.

tìm config/session.php và thay đổi

'expire_on_close' => false,

để

'expire_on_close' => true,

+2

Tôi cố gắng đó , và vẫn phải đối mặt với cùng một lỗi ** "Xác nhận giả mạo yêu cầu chéo trang không thành công. Yêu cầu thông số" trạng thái "bị thiếu." ** – ihue

1

Đối với những người đang sử dụng Code Igniter, bạn sẽ phải tự động load các thư viện phiên.

Thay đổi của bạn application/config/autoload.php, thư viện phải bao gồm 'phiên':

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

Trong CodeIgniter, công việc này, cảm ơn. – user2580401

Các vấn đề liên quan