我正在使用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
我们可以做些什么来自动刷新此令牌?
答案 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拨打电话。