首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keycloak on Angular -加载时状态不正确

Keycloak on Angular -加载时状态不正确
EN

Stack Overflow用户
提问于 2021-02-27 15:27:18
回答 3查看 675关注 0票数 0

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

在页面加载时,当我初始化keycloak时,我想要获得loggedin状态。即使会话处于活动状态,我也总是得到false。

这是我的初始化器代码:

代码语言:javascript
复制
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:

EN

回答 3

Stack Overflow用户

发布于 2021-03-01 16:54:33

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

票数 1
EN

Stack Overflow用户

发布于 2021-02-27 20:31:55

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

代码语言:javascript
复制
initOptions: {
  onLoad: 'login-required',
  checkLoginIframe: false,
  pkceMethod: 'S256'
},

此外,async/await语法也可能是一个问题(但Angular/JS不是我喜欢的,所以我可能会错)。我会将其重写为:

代码语言:javascript
复制
keycloak.init(
  ...
).then(async authenticated => {
  if (!authenticated) {
    // unauthenticated
    console.log(a)
    window.location.reload()
    return
  } else {
    // authenticated
    console.log(a)
    ...
  }
票数 0
EN

Stack Overflow用户

发布于 2021-03-01 01:00:22

请尝试使用此初始化方法:

代码语言:javascript
复制
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);
    });
};
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66396544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档