Я новичок в OAuth2 и Spring Cloud Gateway (и в WebFlux).
Моя команда решила перейти со шлюза Zuul на Spring Cloud Gateway. И текущая версия Spring Cloud - "Greenwich.SR1"
Проблема в том, что Spring Cloud Gateway всегда отвечает 401.
Как правильно передать токен доступа на Spring Cloud Gateway?
Сервер авторизации:
@EnableEurekaClient
@EnableAuthorizationServer
@SpringBootApplication
public class AuthServer {...} // jwtAccessTokenConverter bean included
Зуул сервер:
@EnableEurekaClient
@EnableZuulProxy
@SpringBootApplication
public class ZuulServer {...}
Свойства сервера Zuul:
zuul:
sensitive-headers: Cookie,Set-Cookie
ignored-services: '*'
routes:
auth: /auth/**
Свойства сервера Spring Cloud Gateway:
spring:
cloud:
gateway:
routes:
- id: auth
uri: lb://auth
predicates:
- Method=POST
- Path=/auth/**
filters:
- RemoveRequestHeader= Cookie,Set-Cookie
- StripPrefix=1
Сервер Spring Cloud build.gradle:
plugins {
id 'java'
id "io.freefair.lombok" version "3.2.0"
id "org.springframework.boot" version "2.1.5.RELEASE"
id "io.spring.dependency-management" version "1.0.6.RELEASE"
}
version = '1.0.0-SNAPSHOT'
description = 'edge-service2'
sourceCompatibility = '11'
dependencies {
implementation platform("org.springframework.cloud:spring-cloud-dependencies:$springCloudVersion")
implementation "org.springframework.boot:spring-boot-starter-security"
implementation "org.springframework.cloud:spring-cloud-starter-netflix-eureka-client"
implementation "org.springframework.cloud:spring-cloud-starter-netflix-ribbon"
implementation "org.springframework.cloud:spring-cloud-starter-netflix-hystrix"
implementation('org.springframework.cloud:spring-cloud-starter-gateway')
implementation "org.springframework.cloud:spring-cloud-config-client"
implementation "de.codecentric:spring-boot-admin-starter-client:$springBootAdminVersion"
implementation "net.gpedro.integrations.slack:slack-webhook:1.4.0"
testImplementation "org.springframework.boot:spring-boot-starter-test"
}
springBoot {
buildInfo()
}
bootJar {
archiveName "${project.name}.jar"
}





В Spring Cloud Security есть функция для ретрансляции токена доступа к нижестоящим службам через Spring Cloud Gateway: https://cloud.spring.io/spring-cloud-static/spring-cloud-security/2.1.3.RELEASE/single/spring-cloud-security.html#_token_relay
Просто используйте фильтр TokenRelay для своего маршрута или конфигурации по умолчанию. Однако это перенаправляет только токен доступа. «Токен доступа — это артефакт, который позволяет клиентскому приложению получить доступ к ресурсу пользователя» [1], тогда как «маркер идентификатора — это артефакт, который доказывает, что пользователь прошел аутентификацию» [1], а также содержит атрибуты пользователя. .
Кажется, это то, что вам нужно в любом случае, но для всех людей, которые используют OIDC и хотят ретранслировать токен идентификатора, вот еще немного информации. Напишите собственный GatewayFilterFactory, где вы:
[1] https://auth0.com/blog/id-token-access-token-what-is-the-difference/
См. github.com/spring-cloud-samples/sample-gateway-oauth2login