如何使用 Keycloak 和 Angular 避免“等待第 3 方检查 iframe 消息时超时”

2024-04-11

我正在尝试使用 Keycloak 服务器保护 Angular 应用程序的安全。我遵循了一些教程,它们或多或少提供了相同的说明,但我遇到了以下错误:

等待第 3 方检查 iframe 消息时超时。

我使用以下 docker-compose 配置启动 keycloak 服务器:

auth:
  container_name: nerthus-tech-auth
  image: quay.io/keycloak/keycloak:17.0.1
  command: start-dev
  environment:
    KEYCLOAK_ADMIN: admin
    KEYCLOAK_ADMIN_PASSWORD: admin
    KC_DB: postgres
    KC_DB_URL: jdbc:postgresql://database:5432/keycloak
    KC_DB_USERNAME: keycloak
    KC_DB_PASSWORD: str0ngP@ssword
  ports:
    - 10010:8080

我创建了一个领域(nerthus)和一个公共客户端(博客),并具有以下配置:

  • 根 URL:http://localhost:4200
  • 有效的重定向 URL:http://localhost:4200/* (根据我的理解,我应该能够缩写为 *)
  • 网络起源:+

在 Angular 应用程序方面,我安装了 keycloak-angular 和 keycloak-js 依赖项:

"keycloak-angular": "^9.1.0",
"keycloak-js": "^16.1.1"

我还为 Keycloak 注册了一个初始化程序:

providers: [
  {
    provide: APP_INITIALIZER,
    useFactory: initializeKeycloak,
    multi: true,
    deps: [KeycloakService]
  }
]
function initializeKeycloak(keycloakService: KeycloakService) {
  return () => keycloakService.init({
                                      config: {
                                        url: 'http://localhost:10010',
                                        realm: 'nerthus',
                                        clientId: 'blog'
                                      }
                                    });
}

对于这一点,我还尝试使用 initOptions.onLoad (带有“login-required”和“check-sso”),但这会导致应用程序需要身份验证才能访问任何页面,这不是预期的行为。

我只希望受保护的页面需要身份验证。因此我设置了警卫:

@Injectable({
  providedIn: 'root'
})
export class AuthGuard extends KeycloakAuthGuard {
  constructor(protected override readonly router: Router,
              protected override readonly keycloakAngular: KeycloakService) {
    super(router, keycloakAngular);
  }

  async isAccessAllowed(route: ActivatedRouteSnapshot,
                        state: RouterStateSnapshot): Promise<boolean | UrlTree> {
    if (!this.authenticated) {
      await this.keycloakAngular.login({ redirectUri: window.location.origin + state.url });
    }

    return this.authenticated;
  }
}

当然我错过了一些东西,但我无法让它发挥作用。我尽量简洁,所以如果缺少一些重要信息,请询问我。


我的解决方案是将 checkLoginIframe 设置为 false。下面是我的配置:

 keycloak.init({
  config: {
      url: 'http://localhost:10010',
      realm: 'nerthus',
      clientId: 'blog'
  },
  initOptions: {
    
    pkceMethod: 'S256', 
    // must match to the configured value in keycloak
    redirectUri: 'http://localhost:4200/your_url',   
    // this will solved the error 
    checkLoginIframe: false
  }});

希望它会有所帮助。 =)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Keycloak 和 Angular 避免“等待第 3 方检查 iframe 消息时超时” 的相关文章

随机推荐

  • Swift - 将数组写入文本文件

    我从一个包含几千行纯文本的文件中读入 myArray 原生 Swift myData String stringWithContentsOfFile myPath encoding NSUTF8StringEncoding error ni
  • 在理解聚集索引时我错过了什么?

    如果没有任何索引 则通过 IAM 索引分配映射 访问表行 我可以使用 IAM 以编程方式直接访问行吗 缺少索引是否意味着读取特定行的唯一方法是全表扫描读取所有表 为什么 IAM 不能参与更具体的直接访问 如果表是堆 换句话说 它没有聚集索引
  • 在画布中将 Raphael JS 生成的 SVG 保存为 png 时出现问题

    我正在尝试转换由以下方式生成的 SVG拉斐尔 JS http raphaeljs com 以及用户 因为您可以拖动和旋转图像 我跟着这个在浏览器中将 SVG 转换为图像 JPEG PNG 等 https stackoverflow com
  • 如何将 Firestore 文档中的所有数据显示到 html 表格中

    我正在设计一个网页 该网页将从我的 firestore 集合中获取数据并显示每个文档及其相应的字段以下是代码 table class table is striped is narrow is hoverable is fullwidth
  • 封装和抽象之间的区别

    我今天去面试了 我有一个问题来自OOP 关于之间的区别封装 抽象 我据我所知回答说封装基本上将数据成员和成员函数绑定到一个称为Class 然而抽象基本上是为了隐藏实现的复杂性并为用户提供方便的访问 我以为她会同意我的回答 但她质疑 如果两者
  • 不包含“GetAwaiter”的定义

    我在下面的代码集中收到以下错误 它在 alliancelookup 行上出错 我不确定我做错了什么 但我自己看不到任何东西 我运行到 crest 的查询似乎运行良好 但我遇到的问题似乎与等待者有关 我想知道是否有解决方法 DynamicCr
  • AudioUnitInitialize 返回 -10851 (kAudioUnitErr_InvalidPropertyValue)

    假设代码是 status AudioUnitSetProperty unit kAudioUnitProperty StreamFormat kAudioUnitScope Input element format sizeof Audio
  • JavaScript 相当于 printf/String.Format

    我正在寻找一个与 C PHP 相当的 JavaScriptprintf 或者对于 C Java 程序员来说 String Format IFormatProvider对于 NET 我的基本要求是目前数字的千位分隔符格式 但处理大量组合 包括
  • 允许多个角色成员资格的自定义 MVC AuthorizeAttribute

    我创建了一个自定义 AuthorizeAttribute 类来处理我的 MVC4 应用程序中的精细授权 这是班级 AttributeUsage AttributeTargets Method AllowMultiple true publi
  • 事件必须是委托类型吗?

    不太熟悉声明和使用事件并收到错误 事件必须是委托类型 基本上想通过IMyInterface作为对另一个类的依赖 该类可以订阅接收MyClassEvent事件和事件数据是MyClass public interface IMyInterfac
  • 删除 RecyclerView 项目

    我有一个 RecyclerView 它在每个特定时期添加项目 添加对象时 如果列表项超过 比方说 500 则第一个项目将被删除 新项目将被添加 如果RecyclerView无法再向下滚动 recyclerView canScrollVert
  • 如何从类似于 Angular 中的 http 的静态数据创建一个 Observable?

    我有一个具有此方法的服务 export class TestModelService public testModel TestModel constructor Inject Http public http Http public fe
  • 忽略已经提交到 Git 存储库的文件 [重复]

    这个问题在这里已经有答案了 我有一个已经初始化的 Git 存储库 我添加了一个 gitignore文件到 如何刷新文件索引以便忽略我想要忽略的文件 取消跟踪single已添加 初始化到您的存储库的文件 i e 停止跟踪该文件 但不将其从系统
  • python 可以有不以“self”作为第一个参数的类或实例方法吗? [复制]

    这个问题在这里已经有答案了 我见过的每一个例子method in a class在Python中 有self作为第一个参数 所有方法都是如此吗 如果是这样 难道Python不能被编写成让这个论点被理解并且因此不需要吗 如果你想要一个不需要访
  • Google Charts:折线图和柱形图之间的切换

    我有一个仪表板 其中包含一些 Google Analytics 指标 我想在每日 每月和每周图表上绘制这些指标 日线图为折线图 其他为柱形图 我能够将图表最初绘制为折线图或条形图 然后将其重新绘制为不同类型 但之后它不会再次重新绘制 这是我
  • 如何构建 systemd 可以直接作为服务执行的 Spring Boot jarfile?

    如何构建一个 Spring Boot jarfilesystemd https freedesktop org wiki Software systemd 可以直接作为服务执行吗 按照中的示例作为 systemd 服务安装 http doc
  • Hadoop:间隔和 JOIN

    我很新Hadoop我目前正在尝试加入两个数据源 其中关键是interval 说 开始日期 结束日期 例如 input1 20091001 20091002 A 20091011 20091104 B 20080111 20091103 C
  • 为什么断言定义为(void)0?

    Why define assert expression void 0 而不是 define assert expression 是在release模式下使用的吗 严格来说 当定义NDEBUG时 我听说有一些原因 但我忘了 void 0 定
  • 使用 Jackson 反序列化 JSON 时的隐式默认值

    当反序列化各种JSON消息时 我想为某种类型的属性提供默认值 这是一般建议 https stackoverflow com a 18806773 147806简单地指定类中的值 但如果必须在多个类中执行此操作 则很容易出错 你可能会忘记一个
  • 如何使用 Keycloak 和 Angular 避免“等待第 3 方检查 iframe 消息时超时”

    我正在尝试使用 Keycloak 服务器保护 Angular 应用程序的安全 我遵循了一些教程 它们或多或少提供了相同的说明 但我遇到了以下错误 等待第 3 方检查 iframe 消息时超时 我使用以下 docker compose 配置启