2016-12-24 31 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库,可提供更完整的功能集。免责声明:我是作者,你可以给我反馈;-) –

相关问题