OAuth(Facebook 应用程序)出现身份验证问题,会话不可用?
我想读取当前用户朋友的所有生日。我使用 facebook 的新 Graph API。我请求基于 Facebook read_friendslist 和 friends_birthday
)授权rel="nofollow">见解示例 和 php-sdk 示例。为了读取好友列表和用户详细信息,我使用了 Graph API 和 Facebook PHP SDK。
接下来的代码片段是我的方法的一个简短的、独立的正确示例。如果我尝试使用我的应用程序,它会请求登录,然后请求权限,然后由于没有可用的会话而无法打印我的所有朋友。这是怎么回事?
首先是下面的index.php
使用的birthday.php
,我删除了一些样板代码或我认为它不会导致此问题的代码(由[.. .])。您可以在这个问题的末尾找到完整的代码。
<?php
function get_birthday_of_friends() {
$fbconfig['appid' ] = "MY_APP_ID";
$fbconfig['secret'] = "MY_APP_SECRET";
try{
include_once "facebook/src/facebook.php";
}
catch(Exception $o){
// [...] log error
}
// Create our Application instance.
$facebook = new Facebook(array(
'appId' => $fbconfig['appid'],
'secret' => $fbconfig['secret'],
'cookie' => true,
));
$session = $facebook->getSession();
$fbme = null;
// Session based graph API call.
if ($session) {
// [...] return birthdays
} else {
echo "No session found";
}
}
?>
所需的 lib.php 与见解示例相同。
<?php
// [...] Include and define app-id etc.
function get_access_token($base_url) {
if (isset($_REQUEST['access_token'])) {
return $_REQUEST['access_token'];
}
$params = array();
$params['client_id'] = APP_ID;
$params['redirect_uri'] = $base_url;
if (!isset($_REQUEST['code'])) {
$params['scope'] = 'read_friendlists, friends_birthday';
$url = FacebookMethods::getGraphApiUrl('oauth/authorize', $params);
throw new RedirectionException($url);
} else {
$params['client_secret'] = APP_SECRET;
$params['code'] = $_REQUEST['code'];
$url = FacebookMethods::getGraphApiUrl('oauth/access_token');
$response = FacebookMethods::fetchUrl($url, $params);
$response = strstr($response, 'access_token=');
$result = substr($response, 13);
$pos = strpos($result, '&');
if ($pos !== false) {
$result = substr($result, 0, $pos);
}
return $result;
}
}
// [...] Call get_access_token() and get_birthday_of_friends()!
?>
你能帮我吗?我在pastebin.com上添加了整个源代码,如果这可以帮助您识别我的问题。 Pastebin.com 上的“index.php”和“birthday.php"。
先感谢您!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我不确定您使用的方法是否已弃用,但我知道这是旧方法,您应该尝试使用新方法以获得身份验证令牌。
看看这个链接:
http://developers.facebook.com/docs/authentication/signed_request/
在乍一看,您必须:
signed_request
参数。解码后的链接
它,你将有一个数组,其中
有一个参数叫
oauth_token
。通过以下方式调用图表
将其附加到 URL 例如
*https://graph.facebook.com/PROFILE_ID/pictures/?access_token=OAUTH_TOKEN*
确保您在应用程序的配置设置(“高级”选项卡)中启用了
Oauth 2.0 for Canvas
。I am not sure if the method that you are using is deprecated or not, but I know it's the old way and you should try with the new one in order to get the auth token.
Take a look at this link:
http://developers.facebook.com/docs/authentication/signed_request/
In a glance, you have to:
signed_request
parameter from $_REQUEST.the link to decode it Once you decode
it, you will have an array in which
there is a parameter called
oauth_token
.making calls to the Graph by
appending it to the URL e.g.
*https://graph.facebook.com/PROFILE_ID/pictures/?access_token=OAUTH_TOKEN*
Make sure that you have
Oauth 2.0 for Canvas
enabled into the Configuration settings of your app (Advanced tab).我认为在某些浏览器中第三方 cookie 存在问题。你在 Safari 中测试吗?另外,尝试向 loginUrl 添加权限 - 这比使用 oauth 添加和请求权限更简单。
I think in some browsers there's a prblem with third party cookies. Are you testing in Safari? And also, try to add permissions to the loginUrl - it's a bit more simple than adding and requesting the permissions with oauth.
如果没有可用的会话,我必须重定向到登录页面并需要带有参数的扩展权限。这对我很有帮助,感谢 manuelpedrera 的帮助。
If no session is available, I had to redirect to the login page and require the extended permissions with the parameters. This did the trick to me, thanks to manuelpedrera for helping me out.