我正在使用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,则代码是重复的,有人可以告诉我正确的方法是什么吗?
答案 0 :(得分:0)
过去两年来我一直在研究Node.js,这是我的理解,希望这可以帮助您清除想法。
让我向您解释问题中提到的两个部分的工作。
您的客户中间件
现在我的问题是两个:
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.";
}
});