gpt4 book ai didi

node.js - NodeJS/Express 中使用 API 网关进行微服务 API 身份验证

转载 作者:太空宇宙 更新时间:2023-11-03 22:07:12 25 4
gpt4 key购买 nike

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

I am writing this question because I have several doubts about authentication and communication between microservices.

对于身份验证,我使用 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 将不 protected ,我认为这是错误的,因为任何人都可以调用该路由,相反,如果我维护中间件也是镜像服务,则代码是重复的,任何人都可以告诉我正确的方法是什么?

最佳答案

过去几年我一直在研究 Node.js,这是我的理解,希望这可以帮助你理清思路。

您问题的答案:

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

  • http-proxy-middleware

  • 您的自定义中间件

    • 您的自定义中间件是项目特定代码,用于检查所有请求是否都经过身份验证。
    • 它将检查请求是否具有 token 以及 token 是否有效。

结论:

  • 您强制需要自定义中间件。另一种(http-proxy-middleware) 是可选的。

更新:

现在我的问题有两个:

  1. Is right use an API gateway like this to make communication betweenmicroservices?

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

  1. If I move the authentication middleware from the microservices tothe API Gateway I have to remove the middleware from the API routesand in this way the API will be unprotected if someone other than thegateway make requests and I think this is wrong because anyone cancall that routes, instead if I mantain the middleware also is themircorservice the code is duplicated, can anyone tell me what is theright way to do it?

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

// 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.";
}
});

关于node.js - NodeJS/Express 中使用 API 网关进行微服务 API 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52137902/

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