使用Asana的NodeJS模块(https://github.com/Asana/node-asana)和OAuth,我应该如何处理access_token的过期?客户端是否提供了一些我应该用来检测此问题的机制?它是否提供了我应该使用refresh_token获得新access_token的东西?我无法在文档中找到有关refresh_token的任何讨论。
我已经注册了我的应用程序,并且能够使用 Client.app.accessTokenFromCode API 成功获取凭据。像这样:
function handleOauthCallback(req, res) {
var client = Asana.Client.create({
clientId: CLIENT_ID,
clientSecret: CLIENT_SECRET,
redirectUri: computeRedirectUrl(req)
});
client.app.accessTokenFromCode(req.query.code).then(function(credentials) {
// store credentials
}
}
我存储从此调用返回的整个凭据对象,然后使用这些凭据创建客户端。像这样:
var client = Asana.Client.create({
clientId: CLIENT_ID,
clientSecret: CLIENT_SECRET,
redirectUri: computeRedirectUrl(req)
});
var storedCredentials = getStoredCredentials();
client.useOauth({ credentials : storedCredentials });
现在我有一个使用从 Asana 返回的凭据(包括access_token和refresh_token)初始化的客户端,我应该如何处理access_token过期?我是否需要自己检查它是否仍然有效并使用刷新令牌请求新令牌?还是客户会自动为我处理它?如果客户端处理它,我如何知道它何时获得新的访问令牌?
更新
读取代码时,如果访问令牌不再有效,客户端似乎将尝试使用刷新令牌。但是我没有看到任何类型的通知,我可以挂钩以找出有一个新的访问令牌。是否有推荐的策略来处理此问题?
(我在Asana工作)。这是一个很好的问题,我们应该在文档中添加答案。
可以向dispatcher
传递一个名为 handleUnauthorized
的选项,该选项是在获得 401 时运行的回调(如果您以良好的凭据开始,则仅在令牌过期时发生)。它记录在代码中。
此选项的默认行为是调用 Dispatcher.maybeReauthorize
,如果后端具有刷新令牌,它将发出获取新访问令牌的请求。
因此,如果您只是希望调度程序透明地刷新访问令牌,则无需执行任何操作,它应该"正常工作"!但是,如果要截获此过程,可以在调度选项中传递handleUnauthorized
,然后执行任何操作,可能包括调用默认方法。
如果你想看到新的访问令牌,那么..Authenticator
类是抽象的,我们还没有提供一种强大的方法来从中提取凭据;也许我们可以添加它。如果你真的需要这个,你可以假设它是oauth的味道,如下所示:
handleUnauthorized: function() {
return Dispatcher.maybeReauthorize.call(dispatcher).then(
function(reauthorized) {
if (reauthorized) {
onCredentials(dispatcher.authenticator.credentials);
}
return reauthorized;
});
}
这并不漂亮,但它应该对你有用。请注意,随着时间的推移,我们可能会稍微发展此界面,您将来可能需要对其进行调整。