Keycloak SSO - слишком много перенаправлений - PullRequest
0 голосов
/ 08 мая 2018

Когда сеанс создается в Angular4 с использованием Keycloak-js (версия: 4.0.0), SSO не работает

Ниже приведены шаги для воссоздания этого

  1. Интеграция Keycloak с приложением Angular 4 (например: https://github.com/mauriciovigolo/keycloak-angular или https://github.com/cternes/slackspace-angular2-spring-keycloak/tree/master/frontend)
  2. Когда пользователь пытается войти, он автоматически перенаправляется на страницу входа в Keycloak
  3. После создания сессии попробуйте войти в систему через другое приложение, например, Grafana, с Keycloak или Jenkins
  4. Слишком много перенаправлений (Keycloak работает в порту 8081 и Grafana в 3000)

URL запроса:

http://localhost:8081/auth/realms/angular_keycloak/protocol/openid-connect/auth?access_type=online&client_id=client-ui&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Flogin%2Fgeneric_oauth&response_type=code&scope=read+write&state=wWXu1iyWXtSevSxwCFzWHPZ7oPM63Dbu5AoMBTMdjHE%3D

URL ответа:

http://localhost:3000/login/generic_oauth#state=wWXu1iyWXtSevSxwCFzWHPZ7oPM63Dbu5AoMBTMdjHE%3D&session_state=6ec8255b-ed4c-4399-951c-0241ce7bebad&code=eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..lvjHquloACY0fTMxmOLeYQ.82mSmzkn4HJBSnokMEpqnZw-xkhUrKy9icZAUwVOrh8b4MP9F-8qmH42rrg0O_axTZVJYlozwWA4x9V2dQAIbi2cUgKJlsiNfJllcN8luK4PSwqOe2bp6WtMszvIeU30UW8RXVqf46hstf1dTxWZp-wocChwLaqATNqZD61u-AURLz6ItY8DQxd3hwScR1kJhfu8bJBR_Pcnbt8LIGl_nKOdaGfceoDFpBfOqGuy1AtQ-3QUwvNkBMZCSGVBYQLB.fSMESQYQKVWZfpbR1Rw47A

Варианты опробованы:

  1. Angular4 & Jenkins
  2. Angular4 & Grafana

В то время как следующие шаги работают

  1. Войдите в систему Grafana или Jenkins или непосредственно в KeyCloak
  2. Затем войдите в Angular 4, все работает

Поскольку я могу войти в каждое из этих приложений по отдельности, а SSO работает между Grafana и Jenkins, я склонен полагать, что проблема может быть связана с адаптером Keycloak-Js.

Ниже приведены аргументы, которые я использую для создания сеанса

  const keycloakAuth: any = Keycloak({
            url: environment.KEYCLOAK_URL,
            realm: environment.KEYCLOAK_REALM,
            clientId: environment.KEYCLOAK_CLIENTID,
            'ssl-required': 'external',
            'public-client': true,
        });

1 Ответ

0 голосов
/ 01 февраля 2019

В конце концов, я реализовал функцию единого входа, используя библиотеку Angular-OIDC (неявный поток) https://github.com/manfredsteyer/angular-oauth2-oidc

 private configureWithNewConfigApi() {
 // URL of the SPA to redirect the user to after login
    this.oauthService.redirectUri = window.location.origin + "/index.html";

    // set the scope for the permissions the client should request
    this.oauthService.scope = "openid profile email";

    // set to true, to receive also an id_token via OpenId Connect (OIDC) in addition to the
    // OAuth2-based access_token
    this.oauthService.oidc = true;

    // Use setStorage to use sessionStorage or another implementation of the TS-type Storage
    // instead of localStorage
    this.oauthService.setStorage(sessionStorage);

    this.oauthService.clientId = "<<clientId>>";
    let url = 'https://<<keycloakhost>>:<<port>>/auth/realms/<<realmsname>>/.well-known/openid-configuration';
    this.oauthService.loadDiscoveryDocument(url).then((doc) => {
        // This method just tries to parse the token within the url when
        // the auth-server redirects the user back to the web-app
        // It dosn't initiate the login
        this.oauthService.tryLogin({});      
        console.debug('discovery succeeded', doc);

    });

Спасибо Ян Гараг за ваше предложение

...