2013-02-19 78 views
2

我正在尝试Facebook服务器端登录(使用PHP),并且除了显示我的名字外,一切似乎都起作用。所以,我一直在遵循这个指南:https://developers.facebook.com/docs/howtos/login/server-side-login/,一切都像写在那里一样。我已经过去并删除了所有内容,以确保它是正确的。所以当我登录到我的网站时,我有时会得到“状态不匹配,你可能是CSRF的牺牲品”,但是我总是得到Hello。你好之后就是我的名字应该在的地方,但事实并非如此。所以很明显,登录和授权部分工作,但它不会显示我的名字。你们有谁知道可能是错的?使用Facebook登录用户服务器端登录不起作用

这里是我的代码:

<?php 

$app_id = "MY_APP_ID"; 
$app_secret = "MY_APP_SECRET"; 
$my_url = "MY_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'] . "&scope=user_birthday,read_stream"; 

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

if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['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); 

    $_SESSION['access_token'] = $params['access_token']; 

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

?> 
<!DOCTYPE html> 
<html> 
<head> 
    <title>Personal testing site</title> 
</head> 
<body> 
    <p>This is a personal testing site, and is not related to *mysite* or any of their upcoming functions/ products. </p> 
</body> 
</html> 

编辑1:

我想我可能已经发现了其中的错误,但我仍然不知道如何解决它。所以,当我按照代码工作并试图回显代码的特定部分时,我发现access_token是空的。所以,$ token_url的作品(我认为),但当我试图回声$回应或$ _SESSION ['access_token']他们都是空白。当我试图回显出$ graph_url时,我得到“https://graph.facebook.com/me?access_token=”,没有任何背后的token =,其中access_token应该被连接在上面。我不知道这是连接问题,还是访问令牌为空,但我认为它是最后一个。我一次又一次地检查我的代码,当我将它与Facebook的网页上的代码进行比较时,没有任何问题。

认为你们可以找到任何东西?

编辑2:

当我回声$ TOKEN_URL在我的网页浏览器进入它,我得到这个错误信息:

{ 
    "error": { 
    "message": "Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request", 
    "type": "OAuthException", 
    "code": 100 
    } 
} 

你们认为这可能有什么用事实上,Facebook使用https,但我的网站只使用http?

编辑3:

这里是我的应用程序设置的图片: * Deleted_Picture *

编辑4:

好了,我已经解决了。问题是,应用程序设置中的url必须具有最后一个/,并且我的代码中的$ my_url必须与此完全相同。

但是,我遇到了更多的问题。看起来像ØØÅ这样的字母会在某处变形,并且Ø(这是我的姓氏)变成(Ã)(没有括号)。有谁知道如何解决这一问题?

+0

你检查过'json对象'有一个名为'name'的索引吗? – 2013-02-19 18:46:13

+0

嗨!我只是从他们的网页上复制了一切。所以我猜它有:P – Aleksander 2013-02-19 18:57:54

回答

2

您的应用程序设置似乎存在一些问题。只需在“FB登录网址 - 网站网址”字段中输入您的网址 - http://testing123.feedlobby.com/。将“应用域”字段留空。我会建议创建一个新的应用程序并设置它,然后使用你的新应用程序ID和秘密。

另外,尝试在html正文中包含echo语句。

+0

嗨! “FB登录网址 - 网站网址”字段是什么意思? – Aleksander 2013-02-20 13:24:20

+0

下面是我的设置图像的链接:[链接](http://bildr.no/image/1396928.jpeg) – Aleksander 2013-02-20 13:29:06

+1

你是正确的!我遇到的问题是,$ my_url等于:http://testing123.feedlobby.com没有最后/我显然需要。所以它现在有效;)只有一个问题。这些字母(在挪威的名字中非常常见)在转换中被“破坏”,并且ø变成¸你知道如何解决这个问题吗? – Aleksander 2013-02-20 13:38:47

0

你有没有检查你的应用程序设置和注册这可能是问题之一。 enter image description here

+0

嗨!除了“应用程序域”(我每次都收到一条错误消息)之外,所有东西都被设置了。现在我已经添加了,并且所有内容都按照您的示例填写。 你看,我得到了Facebook登录和授权,但是当它完成并且我被重定向回来时,它只是在没有我的名字的情况下说“你好”。 – Aleksander 2013-02-19 19:00:30

+0

但沙箱模式设置为“禁用”。阅读完他们的教程后,我留下的印象是它应该如此......或者? – Aleksander 2013-02-19 19:07:34