2016-12-24 98 views
1

我在我的Angular 2項目中實現Keycloak身份驗證服務。 我使用服務登錄,註銷等。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; 
    } 
} 

流量:用戶登錄時,用戶嘗試訪問受保護的路由,AuthGuard檢查是否用戶經由isAuthenticated登錄()。

注意:我不想驗證用戶的完整的Angular應用程序。僅限於某些路線。

問題

在用戶登錄後,用戶被重定向到角應用程式。在此之後,isAuthenticated()方法仍然返回false。原因如下:

我將Keycloak對象記錄到控制檯。我發現了一些我不明白的東西。

Keycloak object after login redirect

Keycloak對象後,登錄重定向登錄重定向後


同Keycloak對象(但擴大)

首先通過身份驗證的屬性是假的。擴展認證屬性爲真。

問題

是我儘量保持我的Keycloak對象的正確方式方法是什麼?

請教來源

和別人

回答

2

立足於keycloak's github提供Angular2例如社區,你可以與keycloak JS交互發現一些差異適配器。 主要對已驗證(可能是userName)的實際檢查是在從init返回的promise上完成的。

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查看代碼,它是一個集成Keycloak的Angular 2庫,可提供更完整的功能集。免責聲明:我是作者,你可以給我反饋;-) –