2016-12-24 3 views
1

Я реализую службу аутентификации Keycloak в своем проекте Angular 2. Я использую услугу для входа в систему, выхода из системы и т. Д.Keycloak Angular 2 - Проверка подлинности статуса Объект Keycloak

Аутентификация пользователя и выход из системы, похоже, сработают. Теперь я пытаюсь защитить некоторые маршруты. У меня теперь есть работающий AuthGuard. Чтобы проверить, вошел ли пользователь в систему (в AuthGuard), у меня есть метод isAuthenticated() в службе. Это услуга:

import { Injectable } from '@angular/core'; 

declare let Keycloak: any; 

@Injectable() 
export class KeycloakService { 
    private keycloak = new Keycloak('app/keycloak/keycloak.json'); 

    constructor() { 
    this.keycloak.init({onload: 'check-sso'}); 
    console.log(this.keycloak); 
    } 

    public login() { 
    this.keycloak.login(); 
    } 

    public logout() { 
    this.keycloak.logout(); 
    } 

    public isAuthenticated() { 
    return this.keycloak.authenticated; 
    } 
} 

Flow: Пользователь входит в систему, пользователь пытается достичь защищенного маршрута, AuthGuard проверки, если пользователь вошел в систему с помощью isAuthenticated().

Примечание: Я не хочу, чтобы аутентифицировать пользователя для полного Углового приложения. Только для некоторых маршрутов.

Проблема

После того, как пользователь входит в системе, пользователь перенаправляется на угловое приложение. После этого метод isAuthenticated() возвращает значение false. Вот почему:

Я зарегистрировал объект Keycloak на консоли. Я нашел то, что не понял.

Keycloak object after login redirect

Keycloak объекта после того, как перенаправить Войти


Тот же объект Keycloak после входа в систему перенаправления (но расширен)

Сначала аутентифицирован свойство является ложным. После расширения аутентифицированного свойства это правда.

Вопрос

ли способ, которым я стараюсь поддерживать мой Keycloak объект правильный путь?

Опрошенные источники

И другие

ответ

2

Базирование на сообщества при условии пример Angular2 в keycloak's github вы можете обнаружить некоторые различия во взаимодействии с keycloak JS адаптер. В основном фактическая проверка аутентифицированного (и, возможно, userName) выполняется по обещанию, возвращенному из init.

static init(): Promise<any> { 
    let keycloakAuth: any = new Keycloak('keycloak.json'); 
    KeycloakService.auth.loggedIn = false; 

     return new Promise((resolve, reject) => { 
     keycloakAuth.init({ onLoad: 'login-required' }) 
      .success(() => { 
      KeycloakService.auth.loggedIn = true; 
      KeycloakService.auth.authz = keycloakAuth; 
      KeycloakService.auth.logoutUrl = keycloakAuth.authServerUrl + "/realms/demo/protocol/openid-connect/logout?redirect_uri=/angular2-product/index.html"; 
      resolve(); 
      }) 
      .error(() => { 
      reject(); 
      }); 
     }); 
} 

Также официальный keycloak js adapter's documentation использует обещание для аутентичного проверки

<head> 
    <script src="keycloak.js"></script> 
    <script> 
     var keycloak = Keycloak(); 
     keycloak.init().success(function(authenticated) { 
      alert(authenticated ? 'authenticated' : 'not authenticated'); 
     }).error(function() { 
      alert('failed to initialize'); 
     }); 
    </script> 
</head> 
+0

Спасибо за ответ.Самая большая проблема сейчас - когда возникает обновление страницы, создается новый объект Keycloak и мой статус теряется. – xDs

+0

Привет, правильно ли я понял, что на ваш оригинальный вопрос был дан ответ? Если да, пожалуйста, примите ответ. Что касается вашей следующей задачи, я бы предложил новый вопрос. – hakamairi

+0

Вы также можете проверить код в https://github.com/atende/angular-spa с помощью библиотеки Angular 2, которая объединяет Keycloak и предоставляет более полный набор функций. Отказ от ответственности: Я автор, вы можете отправить мне обратную связь ;-) –

Смежные вопросы