如何使用Asana节点客户端处理OAuth access_token的过期?

使用Asana的NodeJS模块( https://github.com/Asana/node-asana )与OAuth,我应该如何处理access_token的到期? 客户是否提供了一些我应该用来检测的机制? 它是否提供了我应该使用refresh_token获取新的access_token的内容? 在文档中我一直没有find关于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 } } 

我正在存储从此调用返回的整个凭证对象,然后使用这些凭证创build客户端。 像这样的东西:

 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的过期? 我是否需要检查自己是否仍然有效,并使用刷新标记请求新标记? 或者客户会自动为我处理? 如果客户端处理它,我怎么知道它何时得到一个新的访问令牌?

更新

读取代码,看起来客户端将尝试使用刷新令牌,如果访问令牌不再有效。 但是,我没有看到任何一种通知,我可以find有一个新的访问令牌。 有一个build议的策略来处理这个?

(我在Asana工作)。 这是一个很好的问题,我们应该为文档添加答案。

dispatcher程序可以传递一个叫做handleUnauthorized的选项,当它得到一个401的时候,这个callback是运行的(如果你的凭证启动时只有当你的令牌到期时才会发生)。 它被logging在代码中 。

这个选项的默认行为是调用Dispatcher.maybeReauthorize ,这将使后端请求得到一个新的访问令牌,如果它有一个刷新令牌。

所以如果你只是希望调度员透明地刷新访问令牌,你不需要做任何事情,它应该“只是工作”! 但是如果你想拦截这个过程,你可以在调度选项中传递handleUnauthorized ,然后做任何你想要的,可能包括调用默认的方法。

如果你想看到新的访问令牌,那么.. Authenticator类是抽象的,我们还没有提供一个健壮的方式来从中提取凭证; 也许我们可以补充一点。 如果你真的需要这个,你可以认为这是一个类似于oauth的味道:

 handleUnauthorized: function() { return Dispatcher.maybeReauthorize.call(dispatcher).then( function(reauthorized) { if (reauthorized) { onCredentials(dispatcher.authenticator.credentials); } return reauthorized; }); } 

这不是美丽的,但它应该为你工作。 请注意,随着时间的推移,我们可能会逐渐演变这个界面,将来可能需要调整它。