Добавление секрета клиента и идентификатора клиента для запроса в API Gateway - PullRequest
1 голос
/ 10 апреля 2020

У меня есть сервер аутентификации, расположенный за моим Spring Cloud Gateway. Я хочу выполнить аутентификацию JWT через шлюз. Когда я вызываю соответствующую конечную точку API, мне нужно передать свое имя пользователя, пароль, идентификатор клиента и секрет клиента, чтобы сгенерировать токен JWT.

Пользователь просто вызывает конечную точку с именем пользователя и паролем, а шлюз API направляет запрос на сервер аутентификации после подключения client-id и client-secret. Это весь мой план.

Мой вопрос: как я могу прикрепить идентификатор клиента и секрет клиента к своему запросу, используя Spring Cloud Gateway?

Заранее спасибо!

1 Ответ

1 голос
/ 10 апреля 2020

Вы можете создать конфигурацию 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 Cloud.

Для Например, если Spring Cloud Gateway работает на порту 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-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();
    }
}
...