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

How to handle expiration of OAuth access_token using Asana node client?

将 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 时(如果您以良好的凭据开始,则应该只发生在您的令牌过期)。这是 documented in the code.

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

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

如果您想查看新的访问令牌,那么 .. Authenticator class 是抽象的,我们没有提供可靠的方法来 extract 它的凭据;也许我们可以补充一点。如果你真的需要这个,你可以假设它是 oauth 风格的,比如:

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

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