在 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();
}
}
我的 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();
}
}