【问题标题】:JWT verification when using API Gateway (Node / Express)使用 API Gateway (Node / Express) 时的 JWT 验证
【发布时间】: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)。想到了一些解决方案:

  1. 让我的网关可以访问 JWT 密钥并让网关运行 JWT 验证命令。
  2. 在网关上,从 cookie 中提取 JWT 令牌。在 authService 上编写一个 API,该 API 接受令牌作为输入,并将解码后的令牌作为 JSON 返回。让网关使用此 API,然后使用返回的 JSON 在网关上设置 req 对象值。
  3. 代理所有请求到authService,然后让authService代理请求到shorterService。
  4. 将身份验证服务移至我的网关。

我能想到所有这些问题。 #1 表示我的 JWT 密钥现在在 2 个不同的服务上。 #2 看起来很奇怪。 #3 违背了拥有网关的目的。我宁愿避开#4。

是否有一个选项可以让我实际将 req 传递给 authService,允许 authService 运行解码并在 req 对象上设置值,返回到网关,然后继续使用 shortService?这一定比#2更可取吗?

例如,如果这可行,但当我尝试时请求似乎在我的 authService 处终止:

app.use('/', authService, shortenService);

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    选项 #2 似乎很理想,不知道为什么你会说它很奇怪。您确实可以让您的网关使用authService 作为 API:

    Gateway 基本上会检查 cookie(如果没有,甚至不需要联系 authService),将其传递给 authService,然后将响应添加到例如req.auth.

    http-proxy-middleware 中间件允许您先修改请求,例如添加另一个带有 req.auth 的 JSON 表示的标头。在您的其他服务(即shortenService)上,您可以添加一个快速中间件,该中间件将解码标头(如果存在)并将其分配给req.auth

    这种方法为您的所有(未来)服务提供完全相同的req.auth 数据,而只有网关必须与authService 通信。它还允许一些其他方便的东西,例如只允许经过身份验证的服务甚至向您的某些服务发送请求。

    【讨论】:

    • 感谢您的反馈。不太确定是否有更好的方法可以做到这一点,但我会坚持使用与您描述的类似的方法。再次感谢!
    猜你喜欢
    • 2021-11-20
    • 2018-05-23
    • 2021-09-22
    • 2018-11-03
    • 2020-06-08
    • 2010-10-05
    • 2019-09-11
    • 2022-01-13
    • 2020-03-27
    相关资源
    最近更新 更多