通过 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
谓词过滤器,但它不像这样干净。
我有两个项目。两者都是反应性的 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
谓词过滤器,但它不像这样干净。