通过 Spring 云网关使用 JWT returns HTTP 403 调用资源服务器

Calling resource server with JWT returns HTTP 403 by way of Spring Cloud Gateway

我有两个项目。两者都是反应性的 Spring。项目一是 Javascript 应用程序和 Spring 云网关的组合,用于反向代理。第二个项目是Spring资源服务器。

项目一代理来自 /api/artists 的请求到项目二 http://localhost:8081/v1/artists

如果我直接使用有效的 JWT 调用资源服务器(项目二),响应将返回 HTTP 200。如果我通过项目一中的反向代理,并点击 http://localhost:8080/api/artists相同的 JWT,我从项目二收到 HTTP 403,它通过项目一传播回来。

这是我的 Spring 云网关配置:

spring:
  cloud:
    gateway:
      routes:
        - id: experience-api
          uri: http://localhost:8081/v1/artists
          predicates:
            - Path=/api/artists/**
          filters:
            - TokenRelay=

HTTP 403 表示虽然令牌有效,但它必须缺少执行该操作的某些其他权限。虽然,我不确定为什么当我直接调用它而不是通过反向 proxy/Spring 云网关调用它时它会起作用。

离开几天后,我意识到我的网关配置不正确。我意识到原始配置是将请求代理到 /v1/artists/api/artists,这在项目二中不存在,但我的安全配置已设置为 /v1/** 需要身份验证。我怀疑这就是为什么我在看到 HTTP 404 Not Found 之前看到 HTTP 403 Forbidden 的原因。

我最终使用了以下配置:

spring:
  cloud:
    gateway:
      routes:
        - id: experience-api
          uri: http://localhost:8081
          predicates:
            - Path=/v1/artists/**
          filters:
            - TokenRelay=

请注意,我从 uri 属性 中删除了 /v1/artists。现在,在 http://localhost:8080/v1/artists 投射一个的请求被代理到 http://localhost:8081/v1/artists。我本可以使用 StripToken 谓词过滤器,但它不像这样干净。