【发布时间】:2021-10-09 23:17:02
【问题描述】:
简介
我的应用程序由 3 个服务组成:
- 网关:处理所有请求。将它们传递给相应的服务。
- 身份验证:分发存储在 cookie 中的 JWT 令牌以供用户登录。
- Shortener:允许您生成和检索缩短的 URL 的简单服务。
对“/auth”的请求应直接从网关转发到 authService。剩余的请求被转发到shorterService。一切正常。下面是一些示例代码:
const app = express();
const { createProxyMiddleware } = require('http-proxy-middleware');
const PORT = process.env.PORT || 4000;
const authService = createProxyMiddleware({ target: 'http://localhost:3001/'});
const shortenService = createProxyMiddleware({ target: 'http://localhost:3000/'});
app.use('/auth', authService);
app.use('/', shortenService);
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`)
});
问题
我的目标是让所有对 shortService 的请求首先通过我的 authService 上验证 JWT 令牌的函数运行。另外,我想在我的 req 对象上设置一些值(例如:req.userId)。想到了一些解决方案:
- 让我的网关可以访问 JWT 密钥并让网关运行 JWT 验证命令。
- 在网关上,从 cookie 中提取 JWT 令牌。在 authService 上编写一个 API,该 API 接受令牌作为输入,并将解码后的令牌作为 JSON 返回。让网关使用此 API,然后使用返回的 JSON 在网关上设置 req 对象值。
- 代理所有请求到authService,然后让authService代理请求到shorterService。
- 将身份验证服务移至我的网关。
我能想到所有这些问题。 #1 表示我的 JWT 密钥现在在 2 个不同的服务上。 #2 看起来很奇怪。 #3 违背了拥有网关的目的。我宁愿避开#4。
是否有一个选项可以让我实际将 req 传递给 authService,允许 authService 运行解码并在 req 对象上设置值,返回到网关,然后继续使用 shortService?这一定比#2更可取吗?
例如,如果这可行,但当我尝试时请求似乎在我的 authService 处终止:
app.use('/', authService, shortenService);
【问题讨论】: