【问题标题】:How to Pass access token on Spring Cloud Gateway如何在 Spring Cloud Gateway 上传递访问令牌
【发布时间】:2019-10-20 12:24:19
【问题描述】:

我是 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

Zuul 服务器是:

@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-security oauth spring-cloud spring-cloud-netflix spring-cloud-gateway


【解决方案1】:

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],而“ID 令牌是证明用户已通过身份验证的工件”[1],它还包含用户属性.

看来这就是您想要的,但对于所有使用 OIDC 并希望传递 ID 令牌的人,这里有更多信息。 编写一个自定义 GatewayFilterFactory,您可以:

  • 通过exchange.getPrincipal().ofType(OAuth2AuthenticationToken.class)获取认证的Principal
  • 映射它直到你得到一个 oAuth2User 对象
  • 将其转换为 OidcUser
  • 现在你可以做 oidcUser.getIdToken.getTokenValue()
  • 将其放入您选择的标头中,因此您还可以转发 ID 令牌,而不仅仅是访问令牌。

[1]https://auth0.com/blog/id-token-access-token-what-is-the-difference/

【讨论】:

    猜你喜欢
    • 2013-06-24
    • 2018-07-25
    • 2018-06-24
    • 2017-04-09
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多