Keycloak Check-SSO创建

时间:2019-12-11 15:41:52

标签: javascript angular authentication keycloak keycloak-services

我正在使用Angular 8.0.3,keycloak 8.0.0和keycloak-service 7.0.1

我正在尝试制作一些公共页面,所以我在使用'check-sso'。 如果我正确理解,如果用户未登录,浏览器将被重定向回该应用程序,并且保持未经身份验证的状态。

我的应用具有此路由:

const routes: Routes = [
  {
    path: '',
    loadChildren: () => import('src/app/pages/pages.module').then(m => m.PagesModule),
    canLoad: [IsAuthenticateGuard]
  },
  {
    path: 'login',
    component: LoginComponent,
    canLoad: [IsNotAuthenticateGuard]
  },
  {
    path: '**',
    redirectTo: ''
  }
]

后卫:

export class IsAuthenticateGuard implements CanLoad {

  constructor(private keycloakService: KeycloakService, private router: Router) {}

  canLoad(
    route: Route,
    segments: UrlSegment[]
  ): Observable<boolean>|Promise<boolean>|boolean {
    return this.keycloakService.isLoggedIn().then(isLogged => {
      if (!isLogged) {
        this.router.navigateByUrl('/login');
      }
      return isLogged;
    });
  }
}
export class IsNotAuthenticateGuard implements CanActivate {

  constructor(private keycloakService: KeycloakService,
              private router: Router) {}

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
    Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    return this.keycloakService.isLoggedIn().then(isLogged => {
      if (isLogged) {
        this.router.navigateByUrl('/home');
      }
      return !isLogged;
    });
  }

}

我的keycloak有这个初始化配置:

keycloakService.init({
        config: keycloakConfig,
        initOptions: {
          onLoad: 'check-sso',
          checkLoginIframe: false
        },
        bearerExcludedUrls: ['/login'] // (I tried also '.*')
      })

但是我被重定向到:
http://localhost:4200/#error=login_required&state=0b36094c-92ac-4703-a800-77f27e4d206d
没有任何附加内容...

我读了此书,但没有找到解决方法:

https://github.com/mauriciovigolo/keycloak-angular https://www.keycloak.org/docs/latest/securing_apps/index.html#_javascript_adapter

1 个答案:

答案 0 :(得分:2)

您使用的onLoad: 'check-sso'仅在用户登录后才对客户端进行身份验证。

您应该改用onLoad: 'login-required'