为什么我的Facebook访问令牌在Javascript中显示

时间:2015-04-30 04:46:10

标签: facebook facebook-graph-api parse-platform facebook-javascript-sdk

我正在使用Parse创建一个网站,我遇到了一个问题。当我让我的浏览器闲置几个小时时,对图API的调用似乎不再适用。图api的响应是:

  

验证访问令牌时出错:会话已于周三过期,   29-Apr-15 00:00:00 PDT。当前时间是3月29日星期三 - 15日   21:34:32 PDT。

当然,我的令牌已经过期了...但现在我无法找到一种方法来轻松刷新我的访问令牌,而无需通过登录过程将用户送回...这不是一个理想的选择工作流程。

Facebook Javascript文档中的一线希望让我想知道我是否可能只是做错了什么。如果没有,他们的文件可能会产生误导。

  

还要记住生成的访问令牌   浏览器的生命周期通常只有几个小时   由JavaScript SDK自动刷新。如果你正在打电话   从服务器,您将需要生成一个长期存在的令牌,这是   在我们的访问令牌文档中详细介绍。

来源:https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.3#token

我们可以做些什么来自动刷新此令牌?

2 个答案:

答案 0 :(得分:0)

JS SDK应该自动提供新的访问权限,是的 - 虽然我不确定它是否会这样做,如果你只是让应用程序打开几个小时而不与它交互(意思是:重新加载页面,以便JS SDK也被重新初始化了。由于这不是一个非常常见的用例,它可能不会。

我建议您尝试使用FB.getLoginStatus来获取新的访问令牌。 (应该没有必要在后续API调用中明确设置此访问令牌; SDK将自行处理。)

此方法使用内部缓存的结果,以避免每次调用时都向Facebook发出请求。由于令牌的到期时间已知,我希望SDK能够自行决定是否再次需要实际请求 - 但如果没有,您也可以通过将第二个参数设置为{来强制执行新请求{1}}。 (但是对于每次调用都不建议这样做,所以我会尝试看看没有它的方法是否能够解决问题。)

答案 1 :(得分:0)

一个简单的解决方法是在当前access_token过期之前进行API调用。

假设令牌每2小时到期一次,例如,您可以每1H30进行一次简单的/me电话:

/**
 * Make an API Call to refresh the access_token
 */
function tokenRefresh() {
    FB.api("/me", function (response) {
        // the token is refreshed
    });
}

// call it every 1H30
var tokenTimeout = window.setTimeout(tokenRefresh, 5400000);

如果您不希望在用户使用应用程序时执行该代码,那么当它无用时,您可以在每次发出请求时重置回调中的超时:

window.clearTimeout(tokenTimeout);
var tokenTimeout = window.setTimeout(tokenRefresh, 5400000);

因此,您的应用程序会在没有API调用的情况下每个1H30拨打电话。