spring-cloud - 登录到 Spring Cloud Api Gateway 后面的 Keycloak
问题描述
我有 Keycloak 和一个在 Spring Cloud API Gateway 后面运行的微服务。我想允许客户端应用程序执行 /login HTTP 请求,让用户使用他们的用户名和密码登录。
因为客户端应用程序将使用密码授予类型,通过 REST API 向 Keycloak 进行身份验证,它会将 HTTP Post 请求发送到 Keycloak /token 端点
http://localhost:8080/auth/realms/<realm>/protocol/openid-connect/token
我希望这个请求通过 Spring Cloud API Gateway 进行。所以我配置了一条路由,但由于某种原因,即使 Keycloak 正在运行并且端点正确,我也会收到 404 Not Found 错误。无需通过 API 网关,直接向上述端点发送 HTTP Post 请求即可。我想知道为什么我会收到 404 错误?
下面是我的 Spring Cloud API Gateway 路由配置:
server.port=8085
spring.application.name=my-gateway-service
spring.security.oauth2.client.provider.custom.issuer-uri = http://localhost:8080/auth/realms/myrealm
spring.security.oauth2.client.provider.custom.user-name-attribute = preferred_username
spring.security.oauth2.client.provider.custom2.user-info-uri = http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/userinfo
spring.security.oauth2.client.registration.custom.client-name=my-spring-cloud-api-gateway
spring.security.oauth2.client.registration.custom.client-id = my-spring-cloud-api-gateway
spring.security.oauth2.client.registration.custom.client-secret = 3c832be7-2950-4490-801e-276b874d3dd3
spring.security.oauth2.client.registration.custom.scope = profile, openid, roles
spring.security.oauth2.client.registration.custom.authorization-grant-type = password
spring.cloud.gateway.routes[0].id = token-service
spring.cloud.gateway.routes[0].uri = http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token
spring.cloud.gateway.routes[0].predicates[0]=Path=/token-service
spring.cloud.gateway.routes[0].predicates[1]=Method=POST
如果我通过 API Gateway 发送 HTTP Post 请求,我会收到 404 Not found 错误。
curl --location --request POST 'http://localhost:8085/token-service' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'username=username' \
--data-urlencode 'password=mypassword' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'client_id=my-spring-cloud-api-gateway' \
--data-urlencode 'client_secret=3c832be7-2950-4490-801e-276b874d3dd3'
如果我将 Spring Cloud API Gateway 配置为将此 HTTP Post 请求路由到在 localhost 上运行的另一个微服务,那么一切正常。如果我不使用 API Gateway 并将上述 HTTP Post 请求直接发送到 Keycloak 端点 http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token,那么我会得到一个访问令牌。因此 Keycloak 正在运行,并且 OAuth 客户端应用程序配置为使用密码授权。
仅当通过 API Gateway 发送上述请求并使网关将请求路由到 Keycloak 端点 http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token 时才会出现 404 错误代码
我做错了什么?
谢谢!
解决方案
我使用 SetPath 过滤器:
spring.cloud.gateway.routes[0].id=authToken
spring.cloud.gateway.routes[0].uri=http://localhost:8080
spring.cloud.gateway.routes[0].predicates[0]=Path=/auth/token
spring.cloud.gateway.routes[0].predicates[0]=Method=POST
spring.cloud.gateway.routes[0].filters[0]=SetPath=/auth/realms/myrealm/protocol/openid-connect/token
推荐阅读
- ios - 将内容缩放到设备
- makefile - HDF5 库中对 `compress2' 和其他函数的未定义引用
- python - 如何通过以下方式合并两个 DataFrame?
- python - Matplotlib mpl.figure.Figure() 失败,而 fig,ax=plt.subplots() 成功
- angular - 我如何将 html 代码附加到 Angular 中自定义指令的输入字段
- java - 如何注入 JpaRepository 的实现
- python - groupby 并根据另一列的值保留一列的信息
- javascript - JSON.stringify() 行为说明
- python - 无状态显示 matplotlib 图
- javascript - 如何找到给定日期的平均天数?