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



使用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 时运行的回调(如果您以良好的凭据开始,则仅在令牌过期时发生)。它记录在代码中。

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

因此,如果您只是希望调度程序透明地刷新访问令牌,则无需执行任何操作,它应该"正常工作"!但是,如果要截获此过程,可以在调度选项中传递handleUnauthorized,然后执行任何操作,可能包括调用默认方法。

如果你想看到新的访问令牌,那么..Authenticator类是抽象的,我们还没有提供一种强大的方法来中提取凭据;也许我们可以添加它。如果你真的需要这个,你可以假设它是oauth的味道,如下所示:

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

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

相关内容

最新更新