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

标签 node.js api express authentication microservices

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

相关文章:

java - 在 Android 中实现单用户 OAuth

node.js - 中间件和 app.use 在 Expressjs 中的实际含义是什么?

node.js - Redis 的 EVAL 原子是连接还是整个数据存储?

node.js - Expressjs随机挂起,如何输出错误?

mysql - 如何仅显示 MySQL 中基于另一个表的列中的一行 - Express JS

node.js - Babel ES6 无法导出名为 new 或 delete 的函数

api - 单一 API 端点的优缺点

用户评论 : sslv3 alert certificate expired 时 iPhone 应用程序错误

node.js - 如何在 express 中设置单个 session maxAge?

node.js - express中间件修改请求