我正在为 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/