使用新的accessToken更新应用中的accessToken的最佳方法是什么?

时间:2017-06-20 16:32:56

标签: javascript node.js mongodb react-native jwt

在开始实际问题之前

好吧我已经创建了自己的身份验证系统,我将在我的API上使用。

简单说明:
/signup用户键入用户名,密码等... API授予用户tokens存储在数据库中的用户文档中的权限。 API还会返回一个带有新refreshTokenaccessToken的响应正文,我的想法是这样,应用程序可以轻松地将令牌存储在手机上,以便日后调用API。

/login几乎是一样的,除了你只提供用户名和密码。

API中的一条路线是/article,您可以GET& POST

现在,如果您尝试GET /article并且accessToken已过期,则API会自动调用/token,这需要refreshToken标题后,/token会向您授予新的accessToken并请求您尝试获取的相同路线(在这种情况下为/article),标题中包含新的accessToken

问题: 使用 accessToken更新应用中accessToken的最佳方法是什么?

router
  .route('/article')
    .get(
      AuthenticateController.authenticate,
      NewsController.getAllArticles,
      AuthenticateController.sendAuthorize
);

这就是我现在的工作方式,AuthenticateController.authenticate对accessToken进行身份验证并检查它是否已过期,然后调用next()

NewsController.getAllArticles获取所有文章并调用next(),以便AuthenticateController.sendAuthorize可以运行,并在授予新的accessToken时返回新的next()我认为这样可以更容易地在app中使用新令牌。这是我的问题所在,因为我无法在每条路线上调用next(),因为在某些路径上,main函数已经返回响应,这意味着无法调用AuthenticateController.sendAuthorize,这意味着{{} 1}}永远不会运行。我希望AuthenticateController.authenticate成为验证用户所需的唯一中间件。

1 个答案:

答案 0 :(得分:1)

您应该将sendAuthorize中间件移到路由的主要响应之上(或将其与authenticate结合使用),而不是等到发送新令牌的最后一条路由,而是发送使用新令牌的401 Unauthorized响应。然后,更新客户端上的令牌并重新发送请求。

无论如何发送无效accessToken的有效回复似乎是一种愚蠢的做法。您最终会想要使令牌无效(即退出或更改密码),并且您不希望用户能够进行未经身份验证的请求。