【问题标题】:How to handle expiration of OAuth access_token using Asana node client?如何使用 Asana 节点客户端处理 OAuth access_token 过期?
【发布时间】:2015-05-22 20:48:56
【问题描述】:

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

更新

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 关于使新的 access_token 可供客户使用:如果我们无法获得新的令牌,这意味着我们将不得不继续使用过期的 access_token 创建我们的客户。所以客户端最终需要为每个请求获取一个新的令牌。
    • 我不确定我是否理解。你有多少客户?理想情况下,您只需制作一个并共享/重复使用它;如果为每个请求创建一个新请求,则它的设计效率不高。但是我看到,如果您在服务器上,您可能希望存储凭证以备将来的请求(您可能正在创建一个新客户端)。在这种情况下,是的,您可能应该实现类似上面的内容,以便拦截并存储新的访问令牌。
    • 我的服务器是无状态的,所以我为我的服务器的每个请求创建一个新的客户端对象。我今天早上证实,这就像一个魅力。我的访问令牌在周末过期,这段代码让我检测并捕获了新令牌。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2020-08-30
    相关资源
    最近更新 更多