当前位置: 首页 > 知识库问答 >
问题:

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

姬昊焱
2023-03-14

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

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

对于自动认证,我用JWT做了一些测试来认证微服务的应用编程接口,一切都很好,这是一个用于认证的快速中间件的例子:

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网关,我发现这个库可以做到这一点,此外,我读到最好在API网关中添加身份验证中间件,因为如果在每个微服务中重新实现这些功能,那么

现在我的问题有两个:

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

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

共有1个答案

喻珂
2023-03-14

我一直在研究Node。这是我的理解,希望这能帮助你理清思路。

让我向你解释一下你在问题中提到的两个部分的工作。

>

  • 代理:简单地说,代理意味着复制克隆来改变你的流量

你的客户中间件

  • 自定义中间件是特定于项目的代码,用于检查是否所有请求都经过身份验证
  • 它将检查请求是否有令牌,以及令牌是否有效
  • 你需要你的自定义中间件强制。另一个(超文本传输协议-代理-中间件)是可选的。

现在我的问题有两个:

  1. 使用这样的API网关在微服务之间进行通信是正确的吗

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

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

// 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.";
  }
});
 类似资料:
  • 我在AWS上托管了几个微服务(Springdge)。例如,让我们假设Service1和Service2是两个微服务。Service1是前端和移动应用程序访问的微服务。Service1调用Service2。Service2完全是内部的。 我已经设置了位于Service1前面的Amazon API网关。我使用cognito配置了身份验证(Oauth)。 这一切都在起作用。当从前端/应用程序调用时,请求

  • 并输出到控制台: 我试图设置断点并找出网关和身份验证器中的问题所在,但这没有帮助,因为我的应用程序类中的任何断点都没有执行。只有当我将日志设置为调试时,我才在日志中发现一个异常: 我不明白这个异常的真正含义,我发现很多人都得到了相同的异常,但它可能在不同的情况下被抛出。 https://raw.githubusercontent.com/pavelmorozov/springbootgateway

  • 简而言之,应该在哪里执行输入验证和身份验证验证?在 API 网关和每个微服务中?仅在 API 网关中?仅在每个微服务中? 也许部分在api网关中,部分在每个网关中? 谢谢你的回答!

  • 我想通过Spring Cloud介绍Zuul作为一个API网关在少数服务前面。 我关心的问题: > 网关将位于许多服务的前面 某些服务可能公开不需要身份验证的endpoint null

  • 问题内容: 我正在尝试使用oauth API通过Java API对Google服务帐户进行身份验证。我希望使用它来访问Google Bigquery。我的API请求返回了“无效的赠款”。 这是代码,它是基本身份验证示例的副本(不是Bigquery的。而是另一个Google API): SERVICE_ACCOUNT_EMAIL是以下格式的电子邮件地址:XXXXXXX@developer.gserv

  • 我正在使用以下npm来尝试使用NodeJS创建云服务。https://www.npmjs.com/package/azure-mgmt-compute 这是我正在使用的代码: 我收到错误:“服务器未能对请求进行身份验证。请验证证书是否有效以及是否与此订阅关联”。状态代码403。 我已经完成了这里写的:https://msdn.microsoft.com/en-us/library/azure/gg