Facebook访问令牌 - 服务器端身份验证

问题描述:

您好,我试图使用Facebook服务器端的身份验证来获取访问令牌,但不断收到我的错误。Facebook访问令牌 - 服务器端身份验证

我现在用的波纹管:

$app_id = "YOUR_APP_ID"; 
    $app_secret = "YOUR_APP_SECRET"; 
    $my_url = "YOUR_URL"; 

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

的App ID和APP的秘密已被删除,所以不要担心部分。 我得到有关get_file_contents超时的错误。

[function.file-get-contents]: failed to open stream: Connection timed out

是否有另一种或更好的获取访问令牌的方法?

贝娄是版本我都试过,包括卷曲的想法:

function get_data_cURL($url) 
{ 
    $ch = curl_init(); 
    $timeout = 5; 
    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); 
    $data = curl_exec($ch); 
    curl_close($ch); 
    return $data; 
} 

function getAccessToken(){ 
    $app_id = FB_APP_ID; 
    $app_secret = FB_SECRET_ID; 
    $canvas_URL = FB_CANVAS_URL; 

    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($canvas_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($canvas_URL) 
     . "&client_secret=" . $app_secret . "&code=" . $code; 

    $returned_content = get_data_cURL($token_url); 
    echo'Well Done! - '.$returned_content; 

    } 
    else { 
     echo("The state does not match. You may be a victim of CSRF."); 
    } 
} 

详情:

应用程序设置 - 帆布网址:http://www.apps.elistone.co.uk/DrawMyFriend/

FB_APP_ID = The Facebook App ID 
FB_SECRET_ID = The Facebook Secret ID 
FB_CANVAS_URL = http://www.apps.elistone.co.uk/DrawMyFriend/ 

即使此更新我仍然得到这个错误:

旧的错误

Well Done! - {"error":{"message":"Error validating verification code.","type":"OAuthException","code":100}}

新的错误

这似乎被重定向移除状态代码引起的。

The state does not match. You may be a victim of CSRF. - 193c791ddd71c3fd84d411db5554c315 (state code)

我也试图通过改变绕过CSRF保护:

if($_REQUEST['state'] == $_SESSION['state']) 

TO:

if(!empty($code)) 

但是,这仍然使旧的错误问题,我听说它是​​造成在重定向链接的东西,但我不知道如何解决它。

问题解决了

沿着时间尝试我已经导致使用以下,以获取用户访问令牌使用PHP SDK后:

$app_id = FB_APP_ID; 
$app_secret = FB_SECRET_ID; 
$canvas_URL = FB_PAGE_URL; 
$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=" . $canvas_URL . "&state=" 
    . $_SESSION['state']; 

    echo("<script> top.location.href='" . $dialog_url . "'</script>"); 
} 
if($_REQUEST['state'] == $_SESSION['state']) { 
$facebook->api('oauth/access_token', array(
    'client_id'  => FB_APP_ID, 
    'client_secret' => FB_SECRET_ID, 
    'type'   => 'client_cred', 
    'code'   => $code, 
)); 
$token = $facebook->getAccessToken(); 
echo$token; 
} 

现在我准备把它变成一些sorta函数。 非常感谢大家的时间和帮助。

希望这有助于有需要的人,将来在这个步骤(除非Facebook的突然改变了一切)失败的

+0

任何你不想使用Facebook PHP SDK的原因? – phwd

+0

@phwd为什么我不使用PHP SDK的原因是因为这是给我的应用程序访问令牌不是用户访问令牌,这是我需要做我想做的事情。 –

我建议您使用PHP SDK library与Facebook API进行通信。并简单地使用getAccessToken()getAccessTokenFromCode()方法。

UPDATE

检索用户访问令牌你获得访问令牌之前发送的OAuth请求。回答更新的详细信息:

$facebook->api('oauth/access_token', array(
     'client_id'  => APP_ID, 
     'client_secret' => APP_SECRET, 
     'type'   => 'client_cred', 
     'code'   => $code, 
    )); 
    $token = $facebook->getAccessToken(); 
+0

getAccessToken()当前仅向我提供应用程序访问令牌,该令牌对于我所需要的不够好。我希望要求用户访问令牌。我将如何去设置它来做到这一点? –

+0

使用'getUserAccessToken()'方法看起来那么接近 – Oleg

+0

,但是这个错误:'致命错误:调用受保护的方法BaseFacebook :: getUserAccessToken()' –

两个最可能的原因是:

  • redirect_uri缺少尾随“/”
  • redirect_uri在调用/oauth/access_token不完全匹配您的OAuth的对话框提供的REDIRECT_URI

在任何一种情况下,代码验证都将失败,并且您将无法获得令牌,

“未能打开流:连接超时”错误可能与此无关,但它通常指向尝试从服务器到达graph.facebook.com时出现DNS或网络错误

+0

redirect_uri = http://www.apps.elistone.co.uk/DrawMyFriend/因此它具有尾部斜线。从我所看到的uri完全一样。所以缺少了什么。 –