1

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

更新

阅读代码,如果访问令牌不再有效,客户端似乎将尝试使用刷新令牌。但是我没有看到任何可以挂钩的通知来发现有一个新的访问令牌。是否有推荐的策略来处理这个问题?

4

1 回答 1

2

(我在 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;
      });
}

这并不漂亮,但它应该适合你。请注意,随着时间的推移,我们可能会稍微改进此界面,您将来可能需要对其进行调整。

于 2015-03-06T21:18:22.070 回答