微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Angular 上的 Keycloak - 在加载时没有获得正确的状态

如何解决Angular 上的 Keycloak - 在加载时没有获得正确的状态

使用最新的 angular (11)、最新的 keycloak-angular 和 keycloak-js。

页面加载时,当我初始化 keycloak 时,我想获得登录状态。即使会话处于活动状态,我也总是出错。

这是我的初始化代码

import { KeycloakService } from 'keycloak-angular';
import { AppService } from 'src/app/app.service';
import { environment } from '../environments/environment';
 
export function initializer(keycloak: KeycloakService,appService: AppService): () => Promise<any> {
    return (): Promise<any> => {
        return new Promise<void>(async (resolve,reject) => {
          try {
            await keycloak.init({
                config: {
                    url: environment.keycloak.issuer,realm: environment.keycloak.realm,clientId: environment.keycloak.clientId
                },loadUserProfileAtStartUp: true,initOptions: {
                checkLoginIframe: true
              },bearerExcludedUrls: []
            }).then((a) => {
              console.log(a); // this returns always false
            });
            resolve();
          } catch (error) {
            reject(error);
          }
        });
      };
}

即使在以下情况下也会返回 false:

enter image description here

解决方法

我会说它首先需要带有 pkce 流程的授权代码,因为它是 SPA(当然使用的 OIDC 客户端必须是公开的):

initOptions: {
  onLoad: 'login-required',checkLoginIframe: false,pkceMethod: 'S256'
},

async/await 语法也可能是个问题(但 Angular/JS 不是我的菜,所以我可能是错的)。我会把它改写为:

keycloak.init(
  ...
).then(async authenticated => {
  if (!authenticated) {
    // unauthenticated
    console.log(a)
    window.location.reload()
    return
  } else {
    // authenticated
    console.log(a)
    ...
  }
,

请试试这个初始化方法:

export function initializer(keycloak: KeycloakService): () => Promise<any> {
return (): Promise<any> => {
  return new Promise(async (resolve,reject) => {
    try {
      await keycloak.init({
        config: {
                url: environment.keycloak.issuer,realm: environment.keycloak.realm,clientId: environment.keycloak.clientId
            },initOptions: {
          onLoad: 'check-sso',checkLoginIframe: false
        },enableBearerInterceptor: true,bearerPrefix: 'Bearer',bearerExcludedUrls: [
          'main.js',]
      });
      resolve();
    } catch (error) {
      reject(error);
    }
  }
    )
    .catch((e) => {
      console.log('Error thrown in init ' + e);
    });
};
}
,

正如我在评论中所写,我发现我必须拥有 onLoad 属性。 我不想有 onLoad: 'login-required',因为大多数页面不需要用户登录,所以我不得不添加 onLoad: 'check-sso'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?