【问题标题】:Spring Boot Oauth2 SSO with wso2 identity server using zuul as api-gateway with consul service discoverySpring Boot Oauth2 SSO 和 wso2 身份服务器使用 zuul 作为 api-gateway 和 consul 服务发现
【发布时间】:2016-09-01 13:07:24
【问题描述】:

我们正在尝试做一个 POC,其中我们使用 wso2 身份服务器作为 Oauth2 身份验证服务器,我们使用 ZUUL 作为 API 网关

zuul 代理服务

@EnableZuulProxy
@EnableOAuth2Sso
@SpringBootApplication
public class ApiGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }
}

application.properties

security.basic.enabled=false
security.oauth2.client.accessTokenUri=https://172.16.0.102:9443/oauth2/token
security.oauth2.client.clientId=erX25bMjkEwIS7ZDxP5vYRM1r5Ya
security.oauth2.client.clientSecret=A2kDWZ_WVProSgf2TuNE15jy8Oga
security.oauth2.client.userAuthorizationUri=https://172.16.0.102:9443/oauth2/authorize
security.oauth2.client.preEstablishedRedirectUri=https://172.16.0.42:8900/resource/greeting
security.oauth2.client.useCurrentUri=false
security.oauth2.resource.userInfoUri=https://172.16.0.102:9443/oauth2/userinfo
security.oauth2.resource.preferTokenInfo=false
server.port=8900
spring.application.name=ZUUL
zuul.ignoreLocalService=false
server.ssl.key-store=wso2carbon.jks
server.ssl.key-store-password=wso2carbon
server.ssl.keyStoreType=jks
security.oauth2.client.grantType=authorization_code

zuul.routes.resource.path=/resource/**
zuul.routes.resource.url=https://localhost:8090

现在我们面临两个问题

  1. 我们无法集成 CONSUL 和 ZUUL 服务,我的服务能够向 CONSUL 注册,但是当我将 @EnableZuulProxy 添加到我的服务时无法连接到 consul 抛出异常

    com.ecwid.consul.transport.TransportException: java.net.ConnectException:连接被拒绝:连接

  2. 我们现在可以重定向到 wso2 IS 的登录页面,当我们尝试登录时,它会尝试将我重定向回回调 URL 但我的浏览器无法获取访问令牌,并且显示重定向太多。我无法理解,是因为我的配置还是其他原因。 当我用谷歌搜索时,我试图按照建议清除我的历史记录,但它不起作用

如果有人对此有任何想法,请帮助.....

【问题讨论】:

    标签: spring-boot wso2is spring-cloud netflix-zuul consul


    【解决方案1】:

    我认为您的第二个问题可能发生的情况是 OAuth2 授权/资源服务器陷入与网关的重定向循环中。

    您的登录成功将您重定向到/resource/greeting 页面,我认为这是受保护的资源。然后网关无法验证您的令牌并将您重定向回登录(您的会话已经验证,并将您重定向回来)。

    您需要确定网关无法验证令牌的原因。您可以尝试一些可以揭示潜在问题的方法。

    第一件事是尝试使用 CURL 命令验证令牌。从身份验证服务器检索到有效令牌后,在获取受保护资源时将不记名令牌添加到请求标头中,例如 https://172.16.0.42:8900/resource/greetinghttps://172.16.0.102:9443/oauth2/userinfo

    如果您可以使用 CURL 验证令牌,您就知道您的设置正确,并且您的网关应该能够回调资源服务器以获取经过身份验证的用户的信息。如果是这种情况,那么您可以在网关应用程序中诊断问题。

    此时,一种可能性可能与无效的 CSRF 令牌有关。我已经将一个示例放在一起,该示例类似于您想要执行的操作并禁用了 CSRF 令牌。在网关中禁用 CSRF 仅用于诊断目的,不建议作为长期解决方案。

    https://github.com/kbastani/spring-cloud-event-sourcing-example/blob/master/edge-service/src/main/java/demo/EdgeApplication.java#L28

    您在 Zuul 网关上的配置也存在一些问题。您似乎将/resources/** 路由到https://localhost:8090。如果我的假设是正确的,那么您并没有保护您从网关代理到的服务。建议您的后端服务指定其哪些资源受到保护,以便网关可以同时提供受保护和不受保护的 API 资源。

    查看本例中的配置:

    https://github.com/kbastani/spring-cloud-event-sourcing-example/blob/master/edge-service/src/main/resources/application.yml#L38

    至于你的第一个问题,我没有一个好的答案。我怀疑在添加@EnableZuulProxy 的情况下,Consul 的默认连接 URL 已更改。我会在 Consul 配置属性类中对您的应用程序进行断点。见这里:

    https://github.com/spring-cloud/spring-cloud-consul/blob/master/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryProperties.java

    【讨论】:

    • 感谢您的回复,它确实有助于理解问题,但问题的实际原因是自签名证书,我会更新答案
    【解决方案2】:

    无论 Kenny 建议什么都是有效的,但在我们的案例中,我们面临重定向循环问题,因为当我们在信任存储中安装证书时使用的是自签名证书,它可以工作!!!我们在安装证书后才知道 wso2 还需要对属性进行一些修改

    security:
      oauth2:
        client:
          clientId: fdrfsdgersdgdrf
          clientSecret: dsgardgdfgadfgad
          accessTokenUri: https://localhost:9443/oauth2/token
          userAuthorizationUri: https://localhost:9443/oauth2/authorize
          clientAuthenticationScheme: form
          scope: openid
          use-current-uri: true
        resource:
          userInfoUri: https://localhost:9443/oauth2/userinfo?schema=openid
    spring:
      resources:
        chain:
          enabled: true
    
    server:
      ssl:
        key-store: localhost.pfx
        key-password: localhost
        key-store-type: PKCS12
    
        trust-store: localhost.pfx
        trust-store-password: localhost
        trust-store-type: PKCS12
      port: 8080
    

    我通过改变 POM 中的依赖关系解决了我的第一个问题

    之前

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-all</artifactId>
    </dependency>
    

    之后

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      相关资源
      最近更新 更多