【问题标题】:What is the best way to update the accessToken in the app with the new accessToken?使用新的 accessToken 更新应用程序中的 accessToken 的最佳方法是什么?
【发布时间】:2017-11-23 07:44:14
【问题描述】:

在回答实际问题之前

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

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

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

API 中的一个路由是/article,您可以使用GETPOST

现在,如果您尝试使用 GET /article 并且您的 accessToken 已过期,API 将自动调用 /token 这需要在标头中添加 refreshToken,然后 /token 将授予您一个新的accessToken,并在标头中使用新的accessToken 请求您尝试获取的相同路由(在本例中为/article)。

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

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

这就是我现在的做法,AuthenticateController.authenticate 验证 accessToken 并检查它是否已过期,然后调用next()

NewsController.getAllArticles 获取所有文章并调用next(),因此AuthenticateController.sendAuthorize 可以运行并在授予新文章时在响应标头中返回新的accessToken(我认为这会更容易在应用程序中获取新令牌)。这就是我的问题所在,因为我不能在每条路由上调用next(),因为在某些路由上,主函数已经返回响应,这意味着不能调用next(),这意味着AuthenticateController.sendAuthorize 永远不会运行。我希望 AuthenticateController.authenticate 成为对用户进行身份验证所需的唯一中间件。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢这帮助我得到了我想要的东西!
    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多