我有一个用symfony 2编写的应用程序(并使用fosfacebookbundle和来自fosub的自定义userprovider)。我在那个应用程序中使用来自facebook的js sdk和php sdk。 登录我的应用程序并可以浏览。我有一个页面,我显示用户的Facebook朋友。在我的后端我使用/我/朋友的请求。 让我说我在那个页面上停留约一个小时,显示没有任何活动的朋友。如果我在那个小时后刷新页面,我收到消息:
An exception has been thrown during the rendering of a template ("An active access token must be used to query information about the current user.") in
让我感到困惑。我仍然可以访问我的网站的其他页面,没有直接“Facebook请求”。如果我在其他页面上var_dump facebook access_token,它们看起来不同,例如如果我在同一个浏览器中登录facebook并通过facebook登录我的应用程序,我会在显示用户朋友的页面上获得以下access_token: AAACbRz2shZAIBAFX66jLuQktdlzzIx52lnSvgZB5hiNNxvy0lPbKMcUsC1BHLTnaAllXI9WN7dRHfa5TOj4HmZBjdwgjP5In46dMYSGZBfWrj
Facebook在同一浏览器的另一个标签页面中打开:如果我现在从Facebook注销并刷新我的网站上显示用户朋友的页面,我会收到上述异常消息。如果我浏览到另一个页面,并且var_dump access_token,我得到这个: string(48)“170732376699858 | 6c2b4d7ca20f8a607418845634356”
因此,只显示用户Facebook好友的页面无法正常工作。
在js网站上我正在做以下事情:
function onFbInit() {
if (typeof(FB) != 'undefined' && FB != null ) {
FB.Event.subscribe('auth.authResponseChange', function(response) {
$.each(reponse, function(e) {
alert(e);
});
});
FB.Event.subscribe('auth.statusChange', function(response) {
if (response.session || response.authResponse) {
setTimeout(goLogIn, 500);
} else {
window.location = "{{ path('_security_logout_fb') }}";
}
});
} else {
setTimeout(goLogIn, 500);
}
}
任何想法我做错了什么? 有没有办法通过php sdk来检查access_token是否有效?我仔细阅读了文档,但不知怎的,我找不到办法。
我没有使用离线acces_token,因为它已经过时了
谢谢, 拉莫
答案 0 :(得分:1)
这实际上听起来完全正确。由于您没有使用offline_access权限(并且您没有使用),因此您在每个用户使用Facebook授予的令牌会在一段时间后过期,如您所述。
您可以在服务器端和客户端处理此问题。 但是,由于您要在服务器端发出api请求,因此您需要先了解您要使用的访问令牌是否有效,还有一篇很好的官方博客文章解释了如何:http://developers.facebook.com/blog/post/500/
至于为什么你只在那个页面上得到一个错误页面,而不是你站点中的其他页面,这可能是因为你在制作facebook api请求时没有尝试捕获异常,然后返回错误,但是它是你提出这个请求的唯一地方,那是唯一一个破碎的页面。