使用NodeJS / Express中的API网关进行微服务API身份验证

时间:2018-09-02 14:24:18

标签: node.js express microservices

我正在使用Node JS和Express创建微服务架构。我知道微服务的主要功能之一是面向服务的体系结构,团队可以在其中独立设计,开发和交付其应用程序。因此,在我的设计中,我认为每个微服务都提供了自己的API,并且它们之间通过API相互通信,因此每个微服务都是独立的,并且有自己的生命等待请求。

  

我写这个问题是因为我对   身份验证和微服务之间的通信。

为了便于验证,我使用JWT进行了一些测试以验证微服务的API,并且一切正常,这是用于身份验证的快速中间件示例:

const tokenCheck = (req, res, next) => {
  let token = getToken(req);

  if (token) {
    jwt.verify(token, "password, (err, decoded) => {

      if (err) {
        throw "Failed to authenticate token.";
      } else {
        req.user = decoded;
        next();
      }
    });
  } else {
    throw "No token provided.";
  }
};

以这种方式使用:

router.get("/", tokenCheck, Controller.get);

因此,每条路线都有一层保护层。

关于微服务之间的通信,我读到最好的方法是使用API​​网关,然后发现this库来做到这一点,此外,我读到最好在API网关内添加身份验证中间件,因为如果您在每个微服务中重新实现这些功能,首先是要复制代码,但更重要的是,您需要维护两个不同的软件。

现在我的问题是两个:

1)正确使用this之类的API网关在微服务之间进行通信吗?

2)如果我将身份验证中间件从微服务移动到API网关,则必须从API路由中删除中间件,这样,如果网关以外的其他人发出请求,则该API将不受保护,我认为这是这是错误的,因为任何人都可以调用该路由,相反,如果我保留中间件也是mircorservice,则代码是重复的,有人可以告诉我正确的方法是什么吗?

1 个答案:

答案 0 :(得分:0)

过去两年来我一直在研究Node.js,这是我的理解,希望这可以帮助您清除想法。

您的问题的答案:

让我向您解释问题中提到的两个部分的工作。

  • http-proxy-middleware

    • 代理服务器:简单来说,代理服务器意味着重复克隆也可以改变您的访问量。
    • 了解更多:What is the proxy server?
  • 您的客户中间件

    • 您的自定义中间件是特定于项目的代码,用于检查所有请求是否均已通过身份验证。
    • 它将检查请求中是否包含令牌,并且该令牌是否有效。

结论:

  • 您必须自定义中间件。另一个(http-proxy-middleware )是可选的。

更新:

现在我的问题是两个:

  

1)正确使用这样的API网关之间进行通信   微服务?

答案:不,这不是正确的方法。

  

2)如果我将身份验证中间件从微服务移至   API网关我必须从API路由中删除中间件   这样,如果非   网关发出请求,我认为这是错误的,因为任何人都可以   调用该路由,相反,如果我维护中间件,那也是   mircorservice代码重复,有人可以告诉我什么是   正确的方法吗?

为此,您可以在应用上强加身份验证中间件,以便所有路由都可以执行中间件。 更新您的服务器代码。

// Init App
const App = Express();
// Authentication code
App.use((req, res, next) => {
let token = getToken(req);

  if (token) {
    jwt.verify(token, "password, (err, decoded) => {

      if (err) {
        throw "Failed to authenticate token.";
      } else {
        req.user = decoded;
        next();
      }
    });
  } else {
    throw "No token provided.";
  }
});