我很难通过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
参数向graph.facebook.com/oauth/access_token
提出了一个手动请求,但我确实收到了access_token
。现在,剩下的唯一问题是如何通过PHP SDK实现这一点?
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
,使用没有获得用户ID的相同url)
看看你得到了什么。然后发布你的问题的更新,我们会看到:-)
编辑
如果您没有这样做,那么在开发时让php显示所有错误是很重要的:
error_reporting = E_ALL
(在php.ini中)
身份验证的最后一位使用curl
通过https获取访问令牌。我不是卷曲专家,但这可以帮助克服ssl问题:
Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYPEER] = false;
Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYHOST] = 2;
请将此行更改为此
$userInfo = $facebook->api('/' . $userId);
更改为
$userInfo = $facebook->api('/me');
因为你使用的是你的api,而不是其他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);
?>
问题是我没有将fb_ca_chain_bundle.crt
文件复制到facebook.php
和base_facebook.php
所在的目录中。在getAccessTokenFromCode()
中,facebook.com/oauth/access_token...
的代码失败了,但由于它们捕获了异常,所以很难弄清楚。
希望这能为某人节省几个小时的代码跟踪时间。