在 API 网关中将客户端密码和客户端 ID 添加到请求中

Adding client secret and client id to request in API Gateway

我的 Spring 云网关后面有一个 Auth 服务器。我想通过网关进行 JWT 认证。当我调用相应的 API 端点时,我必须传递我的用户名、密码、client-id 和 client-secret 以生成 JWT 令牌。

用户只需使用用户名和密码调用端点,API 网关在附加 client-id 和 client-secret 后将请求转发到 Auth 服务器。这就是我的全部计划。

我的问题是,如何使用 Spring 云网关将客户端 ID 和客户端密码附加到我的请求中?

提前致谢!

您可以创建一个 java 配置,如下所示:

@Configuration
public class SpringCloudConfig {

    @Bean
    public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/oauth/token")
                        .uri("http://localhost:8081/oauth/token")
                        .id("auth"))
                .build();
    }
}

在这种情况下,原始请求和响应将简单地通过 spring 云网关进行代理。

例如,如果spring云网关在运行端口8080上,则请求将是(授权服务器在端口8081上运行):

curl --location --request POST 'http://localhost:8080/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic c2VydmVyX2FwcDpzZWNyZXQ=' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'client_id=server_app'

您可以在客户端添加client-id、client-secret或其他数据。

如果您需要修改请求正文,您可以添加一个过滤器:

@Configuration
public class SpringCloudConfig {

    @Bean
    public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/oauth/token")
                        .filters(f -> f.modifyRequestBody(String.class, String.class, MediaType.APPLICATION_JSON_VALUE,
                                (exchange, body) -> {
                                    String modifiedBody = someService.modify(body);
                                    return Mono.just(modifiedBody);
                                })
                        )
                        .uri("http://localhost:8081/oauth/token")
                        .id("auth"))
                .build();
    }
}