gpt4 book ai didi

node.js - 在 Express/Node Js 中验证基于微服务的 API 端点

转载 作者:行者123 更新时间:2023-12-04 17:32:52 25 4
gpt4 key购买 nike

我正在为 ToDo 应用程序使用 express/MongoDB/Node js 制作一个简单的基于微服务的后端服务器。

我有一个 MongoDB 数据库和两个独立的集合(表)用户和待办事项

第一个微服务用于用户添加用户、删除用户、登录(将 JWT token 返回给客户端并存储在 MongoDB 中以供将来验证私有(private)路由)和注销 API 端点(从数据库中删除 JWT token )。

我的第二个 ToDo 微服务由添加、编辑和删除待办事项三个路由组成,这些都是私有(private)路由,意味着它们在没有用户身份验证的情况下不应该被访问。

以下是两个微服务代码的摘要

用户微服务

Auth 中间件代码(解码 token 并查看用户集合以重新验证 token )

const auth = async (req, res, next) => {
try {
const token = req.header('Authorization').replace('Bearer ', '')

const decoded_token = jwt.verify(token, process.env.JWT_SECRET)
const user = await Users.findOne({ _id: decoded_token._id, 'tokens.token': token })

if (!user) {
throw new Error()
}

req.token = token
req.user = user

next()
} catch (e) {
console.log(e)
res.status(401).send({ error: 'Please login first.' })
}
}

删除当前登录用户endpoing

routes.delete('/users/me', auth, async (req, res) => {
try {
await req.user.remove()

res.send(req.user)

} catch (e) {
res.status(500).send()
}
})

上面的一切都很好,因为身份验证中间件、用户架构/模型和用户删除端点都在我的第一个微服务中

下面是问题

ToDo 微服务

添加 ToDo 端点

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)
}
})

我想在所有 todo 微服务端点上使用 auth 中间件,就像我在用户微服务中删除用户端点时使用的那样。

现在我的问题:除了具有所有必需的东西但其他人没有的用户微服务之外,我将如何授权任何微服务中的任何端点

在 todo 微服务中再次重写 auth 中间件代码是否好,因为它会冗余代码,其次,即使我冗余了代码,在 todo 微服务中也没有用户模式/模型?

或者我是否在用户微服务中创建一个身份验证 API 端点来验证来自数据库的 token 并返回可以从任何其他微服务调用以进行用户身份验证的用户对象?

最佳答案

您应该尝试在您的微服务架构中使用 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认证结构。

希望这对您有所帮助!

关于node.js - 在 Express/Node Js 中验证基于微服务的 API 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57947675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com