authentication - Keycloak Angular 2 - 检查认证状态Keycloak对象

标签 authentication angular keycloak keycloak-services

我正在我的 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;
  }
}

流程:用户登录,用户尝试访问 protected 路由,AuthGuard 检查用户是否通过 isAuthenticated() 登录。

注意:我不想对完整的 Angular 应用程序的用户进行身份验证。仅适用于部分路线。

问题

用户登录后,用户将被重定向到 Angular 应用程序。此后,isAuthenticated() 方法仍然返回 false。原因如下:

我将 Keycloak 对象记录到控制台。我发现了一些我不明白的东西。

Keycloak object after login redirect

登录重定向后的Keycloak对象


Same Keycloak object after login redirect (but expanded)

登录重定向后的相同 Keycloak 对象(但已扩展)

首先,经过身份验证的属性是假的。展开后,经过身份验证的属性为真。

问题

我尝试维护 Keycloak 对象的方式是否正确?

查阅资料

其他

最佳答案

基于社区在 keycloak's github 中提供的 Angular2 示例您可以发现与 keycloak js 适配器交互的一些差异。 主要是对经过身份验证的(可能还有用户名)的实际检查是根据从 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使用 promise 进行认证检查

<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>

关于authentication - Keycloak Angular 2 - 检查认证状态Keycloak对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41313734/

相关文章:

jwt - Keycloak 客户端映射器将域名显示为 JWT token 中的单个属性

PostgreSQL 使用 Ansible 进行对等身份验证失败

javascript - 使用angular primeng根据搜索值显示来自api的用户数据

Angular 5 - 如何在 DatePipe 中使周期字段类型小写

html - 如何使用 Angular 5 在每个页面显示不同的背景颜色?

Keycloak 和 Vault 与客户端角色集成

php - 如何使用 PHP 创建安全的 "remember me"系统?

authentication - 使用 AppCmd 设置特定的 IIS 7 站点?

jquery - 使用 jquery 创建一个带有一些用户名和密码的登录页面

metadata - Keycloak SAML 适配器 : how to export SP XML metadata?