Spring引导Oauth2 SSO与wso2身份服务器使用zuul作为api-gateway与consul服务发现

时间:2016-05-06 12:41:15

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

我们正在尝试使用wso2身份服务器作为Oauth2身份验证服务器进行POC,我们使用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添加到我的服务时无法连接到领事馆 抛出异常

      

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

  2. 我们现在可以重新定位到wso2 IS的登录页面,当我们尝试登录时它会尝试将我重定向回到回拨URL 但我的浏览器无法获得访问令牌,并且显示重定向太多。我无法理解,是因为我的配置还是其他任何原因。 当我用谷歌搜索它时,我试图清除我的历史,但它没有工作

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

2 个答案:

答案 0 :(得分:0)

我认为您的第二个问题可能发生的事情是OAuth2授权/资源服务器被捕获到网关的重定向循环中。

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

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

首先,尝试使用CURL命令验证令牌。从auth服务器检索有效令牌后,在获取受保护资源(例如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

答案 1 :(得分:0)

无论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>