我正在尝试按照示例创建从here到Facebook的服务器端登录,但没有运气。在第7步中,当我尝试使用令牌交换代码并将其存储在会话中供以后使用时,我总是会收到此错误:
file_get_contents(): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request
我知道这已经问了很多次了,但我仍然无法解决这个问题,因为按this question,我尝试使用cURL,但它仍然不起作用,它只是返回false。
Other question告诉我使用PHP SDK,但我不知道使用哪种方法。所以我完全迷失在这里。
这是我调用登录表单的代码:
<a href="<?php echo LOGIN_URL; ?> ?>" class="btn btn-primary">Login with Facebook</a>
其中LOGIN_URL定义为:
define("LOGIN_URL", $facebook->getLoginUrl(array("redirect_uri" => APP_URL . "fb_login")));
在fb_login中,我有这段代码:
$app->get("/fb_login", function() use($app, $facebook)
{
$code = $_REQUEST["code"];
$token_url = "https://graph.facebook.com/oauth/access_token?"
. "client_id=" . APP_ID . "&redirect_uri=" . APP_URL . $_SESSION["request_uri"] // Previous URL
. "&client_secret=" . APP_SECRET . "&code=" . $code;
$response = file_get_contents($token_url); // Doesn't work
$params = null;
parse_str($response, $params);
$_SESSION["access_token"] = $params["access_token"];
// Let's try with cURL...
// $ch = curl_init();
// curl_setopt($ch, CURLOPT_URL, $token_url);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// $output = curl_exec($ch); // Returns false
// curl_close($ch);
$graph_url = "https://graph.facebook.com/me?access_token="
. $params["access_token"];
$user = json_decode(file_get_contents($graph_url));
echo("Hello " . $user->name);
var_dump($code); die();
});
感谢任何帮助。谢谢。
答案 0 :(得分:6)
要直接回答这个问题,问题很可能是您没有urlencode
(使网址传输安全)重定向网址。最快的解决方案是:
$token_url = "https://graph.facebook.com/oauth/access_token?"
. "client_id=" . APP_ID . "&redirect_uri=" . urlencode(APP_URL . $_SESSION["request_uri"])
. "&client_secret=" . APP_SECRET . "&code=" . $code;
但是,我还建议您查看Facebook SDK,因为这样可以帮到您。
答案 1 :(得分:2)
你有没有检查过PHP SDK的文档...它相当广泛而且很好..你只需要设置你的Facebook SDK如下
$facebook = new Facebook(array(
'appId' => 'your app id',
'secret'=> 'your app secret'));
然后您可以将登录网址检索为
$loginURL = $facebook->loginUrl(array(
'scope' => 'read_stream',
'redirect_uri' => 'http://yourdomain/path/to/page'));
此外,SDK可能会让您更好地描述由您处理的错误,这可能是由于重定向URI与应用程序配置不匹配或应用程序ID错误或秘密或完全不同的错误。从here
下载SDK