好吧我已经创建了自己的身份验证系统,我将在我的API上使用。
简单说明:
在/signup
用户键入用户名,密码等... API授予用户tokens
存储在数据库中的用户文档中的权限。 API还会返回一个带有新refreshToken
和accessToken
的响应正文,我的想法是这样,应用程序可以轻松地将令牌存储在手机上,以便日后调用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
成为验证用户所需的唯一中间件。
答案 0 :(得分:1)
您应该将sendAuthorize
中间件移到路由的主要响应之上(或将其与authenticate
结合使用),而不是等到发送新令牌的最后一条路由,而是发送使用新令牌的401 Unauthorized
响应。然后,更新客户端上的令牌并重新发送请求。
无论如何发送无效accessToken
的有效回复似乎是一种愚蠢的做法。您最终会想要使令牌无效(即退出或更改密码),并且您不希望用户能够进行未经身份验证的请求。