Sas*_*ley 37 javascript php session facebook
在PHP 3.0 SDK中,没有getSession()或任何来自Facebook api外部的会话处理.根据这篇博客文章和这个错误报告,几天前facebook的开发者也以某种方式更新了JavaScript sdk .
在过去的几天里,托管的JS SDK引入了一个变化,它破坏了它与当前PHP SDK(2.x和3.x)之间的所有可比性.在其网站上同时使用JS和PHP SDK的开发人员可能会看到服务器端API失败.
但是,我不知道这是否真的会影响我的问题.就像在这个问题的答案中一样,我正在使用PHP检索OAuth对话框的访问令牌,并在会话中保存新的访问令牌.
以下代码显示了我如何处理此会话.$_REQUEST['session']是OAuth对话框响应的内容.
if(isset($_REQUEST['session'])) {
$response = json_decode(stripslashes($_REQUEST['session']), true);
if(isset($response['access_token'])) {
$this->api->setAccessToken($response['access_token']);
$_SESSION['access_token'] = $this->api->getAccessToken();
}
}
elseif(isset($_SESSION['access_token']) && ! isset($_REQUEST['signed_request']))
$this->api->setAccessToken($_SESSION['access_token']);
elseif(isset($_REQUEST['signed_request'])) {
Session::invalidate('fbuser');
$_SESSION['access_token'] = '';
}
Run Code Online (Sandbox Code Playgroud)
以下是我处理用户数据的方法:
try {
$this->user = Session::getVar('fbuser');
if ($this->user === false || is_null($this->user)) {
$facebookUser = $this->api->api('me?fields=id,name,first_name,last_name');
$this->user = new FBUserModel(array('fbId' => $facebookUser['fbId'], ...));
Session::setVar('fbuser', $this->user);
}
}
Run Code Online (Sandbox Code Playgroud)
测试时一切都很好看.仅在发生错误时:第一次设置权限后.现在,由于应用程序在线,似乎每个第二个用户平均发生错误
$facebookUser = $this->api->api('me?fields=id,name,first_name,last_name');
Run Code Online (Sandbox Code Playgroud)
有错误:
An active access token must be used to query information about the current user.
Run Code Online (Sandbox Code Playgroud)
那为什么会这样呢?调试非常困难,因为错误似乎只发生在用户第一次在应用程序身份验证和访问令牌更改后进入应用程序时.即便这样也不会每次都发生.我应该如何使用新的PHP SDK处理会话和访问令牌?
任何帮助都会非常感激!
我发现在iFrame中有一些IE问题与cookies/session有关.正如在这篇博文中看到的那样.有了这个提示和一些进一步的研究,我在我的bootstrap中添加了以下几行:
ini_set('session.use_trans_sid', 1);
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
Run Code Online (Sandbox Code Playgroud)
现在它好多了,但是来自50个用户中的大约2个的信息在登陆页面(身份验证) - >公式 - >和注册之间丢失了.所以我仍然错过了一些东西.
我编辑了我的用户处理
if ($this->user === false || is_null($this->user)) {
// get user data
}
Run Code Online (Sandbox Code Playgroud)
至
if ((is_object($this->user) && $this->user->fbId == '') || $this->user === false || is_null($this->user)) {
// get user data
}
Run Code Online (Sandbox Code Playgroud)
这似乎有点帮助.我认为主要问题是在我的会话中的某个地方.
此外,我添加了一个try/catch块,以查看我的应用程序中某处OAuthException是否抛出了Facebook .如果是这种情况,我会将顶部位置重定向到Facebook页面和标签以获取新的签名请求.虽然这可能有助于解决此问题,但我想阻止我的应用程序重定向用户.
经过几天激烈的调试和日志记录后,我发现,$_REQUEST['session']来自FB.ui permissions.request方法的方法很少是空的.
我是如何处理的:
这是我总是包括的东西:
FB.provide("UIServer.Methods", {'permissions.request': {size : {width: 575, height: 300}, url: 'connect/uiserver.php', transform : FB.UIServer.genericTransform}});
Run Code Online (Sandbox Code Playgroud)
并且在表单提交时调用此函数.总是为我工作,但不知何故它仍然发送表格虽然session == ''.
function getPermission(form) {
session = $('#' + $(form).attr('id') + ' input[name="session"]');
if($(session).val() != '') {
form.submit();
return;
}
FB.ui({method: "permissions.request", "perms": 'user_photos'}, function callback(info){
if(info.status=='connected' && info.session !== null) {
$(session).val(JSON.stringify(info.session));
form.submit();
}
});
return;
}
Run Code Online (Sandbox Code Playgroud)
Ham*_*mza 10
我现在使用PHP SDK 3.x没有任何问题.
类作者Naitik删除了getSession()函数,现在如果你想知道用户是否经过身份验证,请使用getUser().
对于Access令牌,它非常简单,使用此函数getAccessToken(),您将获得访问令牌以进行Graph或Rest API调用.
$user = $facebook->getUser();
if ($user) {
//USER Logged-In
}
else {
//USER not Logged-In
}
//TO GET ACCESS TOKEN
$access_token = $facebook->getAccessToken();
//MAKE AN API CALL WITH IT
$user_info = $facebook->api('me?fields=id,name,first_name,last_name&access_token='.$access_token);
Run Code Online (Sandbox Code Playgroud)
好吧,因为我所做的一切只是一个解决方法,直到新的JS SDK出现,似乎没有最佳实践.设置session.use_trans_sid为1并添加P3P标头有助于克服IE iFrame cookie问题(请参阅我的第一次编辑).经过几天的大量调试后我发现,FB.ui permission_request每次都不会发送新的访问令牌(<5%).
如果发生这种情况,就会出现问题.但这件小事让我发疯.由于这种情况很少发生,我可以将用户重定向回facebook选项卡以获取新的签名请求.有了新的JS SDK,希望这不会再发生了.
有一件事我监督过,解决方案可以在这里找到:FB没有定义问题
我没有异步加载JS SDK!这解释了一切.有时all.js文件加载速度不够快,因此出现了JS错误.因此,权限对话框和JS验证都不起作用,并且发送了一个空的#session输入值.
| 归档时间: |
|
| 查看次数: |
29695 次 |
| 最近记录: |