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

时间:2015-03-06 20:04:55

标签: node.js oauth-2.0 asana asana-connect

在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的到期?我是否需要检查它是否仍然有效并使用刷新令牌要求新令牌?或者客户会自动为我处理吗?如果客户端处理它,我如何找到它何时获得新的访问令牌?

更新

读取代码时,如果访问令牌不再有效,则客户端似乎会尝试使用刷新令牌。但我没有看到任何类型的通知,我可以通过这些通知找出新的访问令牌。是否有推荐的策略来处理这个问题?

1 个答案:

答案 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;
      });
}

这不美观,但应该对你有用。请注意,随着时间的推移,我们可能会对此界面进行一些改进,您可能需要在将来调整它。