我正在使用Express / MongoDB / Node js for ToDo应用程序制作一个简单的基于微服务的后端服务器。
我有一个MongoDB数据库和两个单独的集合(表)用户和待办事项
第一个微服务适用于具有添加用户,删除用户,登录(将JWT令牌返回给客户端并存储在MongoDB中以供将来对专用路由进行验证的用户)和注销API端点(从数据库中删除JWT令牌)的用户。
我的第二个ToDo微服务包含三个添加,编辑和删除todo路由,这些都是私有路由,这意味着未经用户身份验证就无法访问它们。
以下是两个微服务代码的摘要
用户微服务
验证中间件代码(解码令牌并查看用户集合以重新验证令牌)
routes.delete('/users/me', auth, async (req, res) => {
try {
await req.user.remove()
res.send(req.user)
} catch (e) {
res.status(500).send()
}
})
删除当前登录的用户终端
routes.post('/add', auth, async (req, res) => {
try {
const todo = new ToDo({
...req.body,
user_id: req.user._id
})
await todo.save()
res.send({ todo })
}
catch (e) {
res.status(400).send(e)
}
})
上面的所有内容都可以用作身份验证中间件,用户架构/模型,并且用户删除终结点在我的第一个微服务中
问题在下面
待办微服务
添加待办事项端点
{{1}}
我想在所有待办事项微服务端点上使用身份验证中间件,就像我在删除用户微服务中的用户端点时所使用的那样。
现在我的问题: 除了拥有所需的所有东西但没有其他东西的用户微服务之外,我如何对任何微服务中的任何端点进行身份验证
在todo微服务中再次重写auth中间件代码是否很好,因为它将冗余代码,其次,即使我冗余代码,todo微服务中也没有用户架构/模型?
还是我要在用户微服务中创建auth API端点,以验证数据库中的令牌并返回可以从任何其他微服务中调用以进行用户身份验证的用户对象?
答案 0 :(得分:0)
您应该尝试在微服务体系结构中使用API网关。
例如:-您可以使用Kong-https://konghq.com/kong。它也带有自己的PostgreSQL数据库。
现在让我们看一下在您的情况下请求如何工作的流程。
Client | Middleware | User Service | ToDo Service
1. Logs in ------------------------------------>Authenticates user
generates token
<------------------------- saves token in postgres
<--------------------------------------send token to client
2.Now user hits
any endpoint ---------->verify the token
with the saved token -------------------------------> GET, POST
If yes then hit
any service
因此,简而言之,通过使用API网关,您可以轻松实现JWT身份验证结构。
希望这会有所帮助!