在OAuth中使用Asana的NodeJS模块(https://github.com/Asana/node-asana),我该如何处理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的到期?我是否需要检查它是否仍然有效并使用刷新令牌要求新令牌?或者客户会自动为我处理吗?如果客户端处理它,我如何找到它何时获得新的访问令牌?
读取代码时,如果访问令牌不再有效,则客户端似乎会尝试使用刷新令牌。但我没有看到任何类型的通知,我可以通过这些通知找出新的访问令牌。是否有推荐的策略来处理这个问题?
答案 0 :(得分:2)
(我在Asana工作)。这是一个很好的问题,我们应该为文档添加答案。
dispatcher
可以传递一个名为handleUnauthorized
的选项,这是一个回调,当它获得401时运行(如果你开始使用好的凭据,只应在你的令牌过期时发生)。这是documented in the code。
此选项的默认行为是调用Dispatcher.maybeReauthorize
,如果它具有刷新令牌,则会使后端请求获得新的访问令牌。
因此,如果您只是希望调度程序透明地刷新访问令牌,您不需要做任何事情,它应该“正常工作”!但是如果你想拦截这个过程,你可以在调度选项中传递handleUnauthorized
然后做任何你想做的事情,可能包括调用默认方法。
如果你想看到新的访问令牌,那么Authenticator
类是抽象的,我们还没有提供一种强大的方法来从中提取提取凭证;也许我们可以补充一点。如果你真的需要这个,你可以假设这是oauth的味道,如:
handleUnauthorized: function() {
return Dispatcher.maybeReauthorize.call(dispatcher).then(
function(reauthorized) {
if (reauthorized) {
onCredentials(dispatcher.authenticator.credentials);
}
return reauthorized;
});
}
这不美观,但应该对你有用。请注意,随着时间的推移,我们可能会对此界面进行一些改进,您可能需要在将来调整它。