-1

我正嘗試使用Facebook身份驗證在我的網站上登錄,它工作正常。如何以往當我訪問使用https://apps.facebook.com/myApp應用程序,然後我得到一個錯誤當使用apps.facebook.com作爲URL時Facebook身份驗證錯誤

狀態不匹配。你可能是CSRF的受害者

這裏是我從Facebook使用的代碼,我覺得這是在

問題$ my_url

<?php 

    $app_id = "YOUR_APP_ID"; 
    $app_secret = "YOUR_APP_SECRET"; 
    $my_url = "https://www.example.com/login.php"; 

    session_start(); 
    $code = $_REQUEST["code"]; 

    if(empty($code)) { 
    $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection 
    $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
     . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" 
     . $_SESSION['state']; 

    echo("<script> top.location.href='" . $dialog_url . "'</script>"); 
    } 

    if($_REQUEST['state'] == $_SESSION['state']) { 
    $token_url = "https://graph.facebook.com/oauth/access_token?" 
     . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) 
     . "&client_secret=" . $app_secret . "&code=" . $code; 

    $response = file_get_contents($token_url); 
    $params = null; 
    parse_str($response, $params); 

    $graph_url = "https://graph.facebook.com/me?access_token=" 
     . $params['access_token']; 

    $user = json_decode(file_get_contents($graph_url)); 
    echo("Hello " . $user->name); 
    } 
    else { 
    echo("The state does not match. You may be a victim of CSRF."); 
    } 

?> 

回答

0

你真的應該指出Facebook提供用於FTP的SDK。然後,您不需要重新創建任何圖形調用,因爲它都是爲您處理的。

但是這裏有兩個問題:

  1. 您需要整個返回URL編碼在登錄調用即

    & REDIRECT_URI =」。用urlencode($ my_url。 「&狀態=」。 $ _SESSION ['state']);

  2. 如果你想傳遞數據到一個iFrame,你需要發送一個名爲「app_data」的參數 - 所有其他參數將被刪除。 「簽名req uest「,所以你需要解碼signed_request。詳細信息http://developers.facebook.com/docs/authentication/signed_request/(同樣,使用facebook SDK可以輕鬆處理已簽名的請求!)。