我无法通过Facebook PHP SDK验证用户身份。
如果用户尚未经过身份验证,我基本上想要显示“使用facebook登录”按钮。否则,显示用户名。这是代码:
require_once 'facebook.php';
$facebook = new Facebook(array(
'appId' => 'XXX',
'secret' => 'XXX',
'cookie' => true
));
$userId = $facebook->getUser();
var_dump($userId);
if ($userId) {
$userInfo = $facebook->api('/' . $userId);
echo "Welcome, {$userInfo['name']}";
} else {
echo '<a href="' . $facebook->getLoginUrl() . '">' .
'<img src="images/icon_facebook_login.png" alt="Login with Facebook" /></a>';
}
问题是我总是从$facebook->getUser()
得到0。我查看了base_facebook.php
中的代码,在处理函数时,返回URL中需要一个请求参数signed_request
。我在Facebook返回的URL中看到的唯一参数是code
和state
。
我可能搞砸了什么想法?提前谢谢。
编辑:根据ogi
的建议,我向code
的{{1}}参数做了一个手工制作的请求,我收到了graph.facebook.com/oauth/access_token
。现在,剩下的唯一问题是如何通过PHP SDK实现这一目标?
答案 0 :(得分:2)
Canvas应用程序(Facebook上的应用程序)总是从顶部框架收到signed_request
- 来自Facebook。
外部网站没有。在用户批准该应用后,他们会获得code
,显然您也会这样做。
最后一点身份验证是为code
交换access_token
,这是您应该自己测试的。因此,请从请求中获取代码,并在浏览器中尝试以下操作:
https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&
client_secret=YOUR_APP_SECRET&code=THE_CODE
(对于redirect_uri
使用与未获得用户标识的相同网址)
看看你得到了什么。然后发布您的问题的更新,我们将看到: - )
修改强>
如果您没有这样做,在开发过程中让php显示所有错误非常重要:
error_reporting = E_ALL
(在你的php.ini中)
最后一位身份验证使用curl
通过https获取访问令牌。我不是卷毛专家,但这可以帮助克服ssl问题:
Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYPEER] = false;
Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYHOST] = 2;
答案 1 :(得分:0)
请将此行更改为此
$userInfo = $facebook->api('/' . $userId);
更改为
$userInfo = $facebook->api('/me');
因为你使用api而不是另一个。
然后
尝试
echo $userInfo['id']
或者你可以使用这一个完全控制
<?php
require 'fb/facebook.php';
// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(
'appId' => 'xxx',
'secret' => 'xxx',
));
// Get User ID
$user = $facebook->getUser();
// We may or may not have this data based on whether the user is logged in.
//
// If we have a $user id here, it means we know the user is logged into
// Facebook, but we don't know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.
if ($user) {
try {
// Proceed knowing you have a logged in user who's authenticated.
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}
// Login or logout url will be needed depending on current user state.
if ($user) {
$logoutUrl = $facebook->getLogoutUrl();
} else {
$loginUrl = $facebook->getLoginUrl();
}
echo '<pre>';
print_r($user_profile);
?>
答案 2 :(得分:0)
问题是我没有将fb_ca_chain_bundle.crt
文件复制到facebook.php
和base_facebook.php
所在的目录。在getAccessTokenFromCode()
中,facebook.com/oauth/access_token...
的代码失败,但由于它们捕获了异常,因此很难弄明白。
希望这可以节省一些时间的代码跟踪。