Spring Boot Oauth2 SSO с сервером идентификации wso2 с использованием zuul в качестве API-шлюза с обнаружением службы консула

Мы пытаемся сделать 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

теперь мы сталкиваемся с 2 проблемами

  1. # P5 #
    # P6 #
  2. теперь мы можем перенаправить на страницу входа в wso2 IS, когда мы пытаемся войти, он пытается перенаправить меня обратно на URL-адрес обратного вызова, но мой браузер не может получить токен доступа и сообщает слишком много перенаправлений. Я не могу понять, это из-за моей конфигурации или чего-то еще. Я попытался очистить свою историю, как было предложено при поиске в Google, но она не работает

если кто-нибудь знает об этом, пожалуйста, помогите .....


person Brijan Elwadhi    schedule 06.05.2016    source источник


Ответы (2)


Я думаю, что для вашей второй проблемы может произойти то, что сервер авторизации / ресурсов OAuth2 попадает в цикл перенаправления со шлюзом.

Ваш логин успешно перенаправляет вас на вашу /resource/greeting страницу, которая, как я полагаю, является защищенным ресурсом. Затем шлюз не может проверить ваш токен и перенаправляет вас обратно для входа в систему (в котором ваш сеанс уже подтвержден, и он перенаправляет вас обратно).

Вам необходимо определить, по какой причине шлюз не может проверить токен. Вы можете попробовать несколько вещей, которые помогут выявить основную проблему.

Во-первых, попробуйте проверить токен с помощью команд CURL. После получения действительного токена с сервера аутентификации добавьте токен-носитель в заголовок запроса при получении защищенного ресурса, например https://172.16.0.42:8900/resource/greeting или https://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

Что касается вашего первого вопроса, у меня нет хорошего ответа. Я подозреваю, что URL-адрес подключения по умолчанию к Consul изменен для случая, когда вы добавляете @EnableZuulProxy. Я бы поставил точку останова на ваше приложение в классе свойств конфигурации 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

person Kenny Bastani    schedule 08.05.2016
comment
спасибо за ответ, это действительно помогло разобраться в проблеме, но реальной причиной проблемы был самозаверяющий сертификат, я обновлю ответ - person Brijan Elwadhi; 11.05.2016

все, что предложил Кенни, действительно, но в нашем случае мы столкнулись с проблемой цикла перенаправления, потому что мы использовали самозаверяющий сертификат, когда мы устанавливали сертификат в хранилище доверенных сертификатов, это сработало !!! также потребовались некоторые изменения в свойствах для 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>
person Brijan Elwadhi    schedule 20.05.2016