【发布时间】:2021-06-07 22:33:36
【问题描述】:
我有一个 Node 应用程序,它应该在一个 Docker 容器上运行前端,在另一个容器上运行后端。前端和后端都使用 Express。 目前我正在尝试将从前端客户端调用的 API 重定向到后端。
示例:在 38.127.211.116 上运行的前端调用 api /api/get-price/toy/1 并且此 api 应转发到在 87.105.146.57 上运行的后端。
我使用前端服务器中的代理设法做到了这一点,我使用了一个名为“http-proxy-middleware”的 npm 包。 目前我的代码看起来像这样(路径 ?api 下的所有内容都被转发到后端):
.use('/api', createProxyMiddleware({
target: process.env.NODE_ENV === "prod" ? "someValue" : https://${devIpAddress}:${process.env.BACKEND_PORT}/`,
// changeOrigin: true,
secure: process.env.NODE_ENV === "prod" ? true : false // is it safe to have false in prod?
}))
我有几个问题,因为我不完全理解不同方法的含义:
-
代理与 CORS: 这种方法(从前端到后端的代理)或从前端到后端的直接调用允许后端中的 CORS 更好吗? 有哪些优点和缺点?
-
代理中的安全选项: 我可以从文档中阅读:“如果您想验证 SSL 证书,请将安全设置为 true/false”。如果我总是使用 false,也在 prod 中,有什么缺点?我会有安全问题吗?如果是,是哪一个? 因为有了代理,我的后端地址是隐藏的(?),但是如果我只有一台机器,每个用户都可以看到并调用我所有的 API,那么验证调用者的意义何在?
-
代理中的原点选项: 启用更改来源有什么好处?
-
身份验证: 该网站的一些页面将需要用户身份验证。对于 API,我认为该过程将非常简单,因为调用将被重定向到后端,并且响应将根据用户凭据以正确的响应传回。 我对前端的用户身份验证处理更感兴趣。因为我必须提供 html 页面,并且这些页面应该只提供给登录的用户。但是带有凭据的数据库在后端,那么这里最好的策略是什么? 我正在考虑在共享公共 Express 文件夹的代码之前放置一个中间件,并在用户请求需要登录的页面时向后端发送 http 请求。如果响应是肯定的,则请求将继续显示页面继续,否则它将退出。 但我想知道这是否是正确的方法。比如:
.use("/admin", ()=>{ // pseudo code const result = httpCallToBackend(); if(!result) exit; }) // if positive go to next instruction - show html page .use(express.static(process.env.STATIC_FOLDER_PATH, { extensions: ["html"] }))
【问题讨论】:
标签: node.js docker express proxy backend