1

我有一个用 symfony 2 编写的应用程序(并使用 fosfacebookbundle 和来自 fosub 的自定义 userprovider)。我在该应用程序中使用来自 facebook 的 js sdk 和 php sdk。登录到我的应用程序并可以四处冲浪。我有一个页面,其中 ai 向用户显示 Facebook 朋友。在我的后端,我使用 /me/friends 来处理该请求。假设我在该页面上停留了大约一个小时,该页面显示没有任何活动的朋友。如果我在那一小时后刷新页面,我会收到以下消息:

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 是否有效?我通读了文档,但不知何故我没有找到办法。

我没有使用离线访问令牌,因为它会过时

谢谢,拉莫

4

1 回答 1

1

这听起来完全正确。正如您所描述的,由于您不使用offline_access 权限(并且您不这样做是对的),因此每个用户授予您的令牌会在一段时间后过期。

在服务器端和客户端,您有几个选项可以处理此问题。但是由于您是在服务器端发出 api 请求,您需要首先确定您要使用的访问令牌是否有效,有一篇很好的官方博客文章解释了如何:http: //developers.facebook.com/博客/帖子/500/

至于为什么你只在那个页面而不是你网站的其他页面上得到一个错误页面,这可能是因为你在发出 facebook api 请求时没有尝试捕获异常,然后返回一个错误,但因为它是唯一的在您提出请求的地方,那是唯一损坏的页面。

于 2012-02-15T19:47:22.087 回答