我有一个facebook应用程序,它通过PHP-SDK连接到facebook。
$facebook = new Facebook(array(
'appId' => FACEBOOK_APP_ID,
'secret' => FACEBOOK_SECRET_KEY,
));
$user = $facebook->getUser();
if ($user) {
try {
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}
一切都很好,我让浏览器打开,不响应我的应用程序。过了一会儿,我尝试通过ajax在应用程序中发送表单。会议似乎无效? Facebook将授权我的应用再次将ajax网址加载到浏览器地址栏中,并将新会话参数附加到该网址并打破该应用。
有什么办法可以假装Facebook“重新加载”或将ajax / form动作传递给浏览器地址栏吗?在处理每个请求之前,我会检查用户是否仍处于活动状态,这可能是问题吗?
$user = $facebook->getUser();
if ($user != 0) {
if($this->userProfile == null){
try {
// Proceed knowing you have a logged in user who's authenticated.
$this->userProfile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}
}else{
$this->userProfile = null;
}
if ($this->userProfile != null) {
$filterChain->run();
} else {
$loginUrl = $facebook->getLoginUrl(
array('scope' => 'publish_stream','redirect_uri' => 'REDIRECT_URI'));
}
echo("<script> top.location.href='" . $loginUrl . "'</script>");
我应该使用其他approch吗? 提前谢谢!
答案 0 :(得分:0)
你真的不应该像常规页面提取一样处理ajax调用。通常,如果在ajax进程中发生类似过期的会话,则需要将错误代码发送回主页并让它在顶层处理它。
我猜你从这个ajax请求发回的信息会立即被解析为HTML吗?这意味着如果您发回<script>top.location=xxx</script>
块,它将被执行并将浏览器重定向到新位置。同样,这可能不是处理事情的最佳方式,但如果redirect_uri设置得当(作为整体的页面的url),它仍然可以工作。因为getLoginUrl()在ajax页面中被调用,所以redirect_uri被设置为该url,所以在新的授权完成后,浏览器被发送回去(现在在顶层)。因此,虽然可能不是最好的整体结构,但是当您在ajax调用中时,快速解决方法是覆盖redirect_uri设置,并使其指向父页面而不是自身。