首页 > 解决方案 > 登录到 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 错误代码

我做错了什么?

谢谢!

标签: spring-cloudkeycloakapi-gatewaykeycloak-rest-api

解决方案


我使用 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

推荐阅读