为什么我的Facebook访问令牌用Javascript表示

为什么我的Facebook访问令牌用Javascript表示,facebook,facebook-graph-api,parse-platform,facebook-javascript-sdk,Facebook,Facebook Graph Api,Parse Platform,Facebook Javascript Sdk,我正在使用Parse创建一个网站,我遇到了一个问题。当我让浏览器闲坐几个小时时,对graph API的调用似乎不再起作用。来自graph api的响应为: 验证访问令牌时出错:会话已于周三过期, 太平洋时间4月29日00:00:00。当前时间是2015年4月29日星期三 太平洋时间21:34:32 当然,我的代币已经过期了。。。但是现在我找不到一种方法来轻松刷新我的访问令牌,而不通过登录过程将用户发送回。。。这不是一个理想的工作流 Facebook Javascript文档中的一线希望让我怀疑自

我正在使用Parse创建一个网站,我遇到了一个问题。当我让浏览器闲坐几个小时时,对graph API的调用似乎不再起作用。来自graph api的响应为:

验证访问令牌时出错:会话已于周三过期, 太平洋时间4月29日00:00:00。当前时间是2015年4月29日星期三 太平洋时间21:34:32

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

Facebook Javascript文档中的一线希望让我怀疑自己是否可能只是做错了什么。如果不是这样,他们的文档就具有可怕的误导性

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

资料来源:


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

JS SDK应该自动提供新的访问令牌,是的–尽管我不确定如果你只打开应用程序几个小时而不与它交互(意思是:重新加载页面,以便JS SDK也重新初始化),它是否会提供新的访问令牌。因为这不是一个非常常见的用例,所以它可能不是

我建议您尝试使用获取新的访问令牌。(随后不需要在后续API调用中显式设置此访问令牌;SDK将自行处理。)


此方法使用内部缓存的结果,以避免每次调用Facebook时都必须向其发出请求。由于令牌的到期时间是已知的,我希望SDK能够自行决定是否需要再次发出实际请求——但如果不需要,您也可以通过将第二个参数设置为
true
来强制发出新请求。(但是,这不建议每次调用都使用,因此我会尝试在不使用该方法的情况下调用该方法是否能够解决问题。)

一个简单的解决方法是在当前
访问令牌过期之前进行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进行调用