2.9. Keycloak JS
此发行版本包括对 Keycloak JS 库的几个更改,应考虑这些库。这些更改的主要动机是把红帽构建的 Keycloak 服务器的库分离在一起,因此可以独立重构,从而简化代码并在以后维护。更改如下:
2.9.1. 这个程序库不再从服务器静态提供
Keycloak JS 库不再由红帽构建的 Keycloak 服务器静态提供。这意味着以下 URL 不再可用:
-
/js/keycloak-authz.js
-
/js/keycloak-authz.min.js
-
/js/keycloak.js
-
/js/keycloak.min.js
-
/js/{version}/keycloak-authz.js
-
/js/{version}/keycloak-authz.min.js
-
/js/{version}/keycloak.js
-
/js/{version}/keycloak.min.js
另外,链接到这些 URL 上库的 keycloakJsUrl
属性已从 Admin Console 主题中删除。如果您的自定义主题使用此属性包含库,您应该更新主题以使用不同的方法包含库。
现在,您应该使用软件包管理器(如 NPM )在项目中包含该库。该程序库在 NPM 注册表上作为 keycloak-js
提供。您可以使用以下命令安装它:
npm install keycloak-js
或者,服务器的分发还包括 keycloak-js-26.0.0.tgz
存档中的库副本。您可以将库从那里复制到您的项目。如果您在没有构建的情况下直接在浏览器中使用库,则需要自己托管该库。软件包管理器仍然是建议将库包含在项目中,因为它将在以后更轻松地更新库。
2.9.2. 现在,需要 Keycloak
实例配置
在以前的版本中,可以在不传递任何配置的情况下构建 Keycloak
实例。然后,根据包含的 keycloak.js
脚本的路径,从 keycloak.json
文件中自动从服务器加载配置。因为库不再从服务器静态提供,所以这个功能已被删除。现在,在构造 Keycloak
实例时需要显式传递配置:
// Before const keycloak = new Keycloak(); // After const keycloak = new Keycloak({ url: "http://keycloak-server", realm: "my-realm", clientId: "my-app" }); // Alternatively, you can pass a URL to a `keycloak.json` file. // Note this is not reccomended as it creates additional network requests, and is prone to change in the future. const keycloak = new Keycloak('http://keycloak-server/path/to/keycloak.json');
2.9.3. 现在,登录的方法是 async
Keycloak JS 现在使用 Web Crypto API 来计算支持 PKCE 所需的 SHA-256 摘要。由于此 API 的异步性质,以下公共方法现在始终返回 Promise
:
-
login()
-
createLoginUrl()
-
createRegisterUrl()
确保将代码更新为 等待
这些方法:
// Before keycloak.login(); const loginUrl = keycloak.createLoginUrl(); const registerUrl = keycloak.createRegisterUrl(); // After await keycloak.login(); const loginUrl = await keycloak.createLoginUrl(); const registerUrl = await keycloak.createRegisterUrl();
确保将您的代码更新为 等待
这些方法。
2.9.4. build-time 选项的更严格的启动行为
当提供的构建时选项在启动时与在最近优化的 Keycloak 构建过程中在服务器镜像中保留的值不同时,红帽构建的 Keycloak 现在将无法启动。在以前的版本中,在这种情况下会显示警告信息。
2.9.5. 新的默认客户端范围 基本
名为 basic
的新客户端范围被添加为 realm "default" 客户端范围,因此将添加到所有新创建的客户端。客户端范围还在迁移过程中自动添加到所有现有客户端。
此范围包含以下声明的预配置的协议映射器:
-
sub
(请参阅以下在专用部分的详细信息) -
auth_time
这提供了额外的帮助来减少轻量级访问令牌中的声明数量,但也有机会配置始终自动添加的声明。
2.9.5.1. 将 子
声明添加到通过协议映射器访问令牌中
现在,子
声明总是添加到访问令牌中,但使用新的 Subject (sub)
协议映射程序。
主题(sub)
映射程序在基本客户端 范围内
默认配置。因此,升级到这个版本后不需要额外的配置。
如果您使用 Pairwise 主题标识符
映射访问令牌的 子
声明,您可以考虑禁用或删除 Subject (sub)
映射器,但并不严格要求它,因为 Subject (sub)
协议映射程序会被执行,因此 pairwise
值将覆盖 Subject (sub)
映射器添加的值。这也适用于覆盖
子
声明的其他自定义协议映射器实施,因为 主题(sub)映射器
目前作为第一个协议映射器执行。
您可以使用 Subject (sub)
映射器来仅针对访问令牌、轻量级访问令牌和内省响应配置 子
声明。IDToken 和 Userinfo 始终包含 子
声明。
映射器对服务帐户没有影响,因为不存在用户会话,并且始终将 子
声明添加到访问令牌中。
2.9.5.2. 非声明只添加到 ID 令牌中
nonce 声明现在只添加到 ID 令牌中,严格遵循 OpenID Connect Core 1.0 规格。如规范中所示,当授权请求中发送了相同的参数时,声明会在 ID 令牌 内编译。该规范还建议在 刷新请求 后添加非
。在以前的版本中,声明被设置为所有响应(刷新包括)中的所有令牌(Access、Refresh 和 ID)。
软件中也包含一个新的 Nonce 后向兼容
映射器,这些映射程序可以分配给客户端范围以恢复到旧行为。例如,JS 适配器在修复版本 24.0.0 中的问题 #26651 前检查所有令牌返回的 非ce
声明。因此,如果使用 JS 适配器的旧版本,则映射程序应该使用客户端范围添加到所需的客户端。
2.9.5.3. 使用旧的 javascript 适配器
如果您使用带有应用程序中 javascript 适配器的较旧版本的 Keycloak 服务器的最新红帽构建,则您可能受上述的令牌更改的影响,如以前的 javascript 适配器版本依赖该声明,这些声明被红帽构建的 Keycloak 添加,但不受 OIDC 规格的支持。这包括:
-
在使用 Red Hat build of Keycloak Javascript adapter 24.0.3 或更早版本时,添加
Session State (session_state)
映射程序 -
当使用红帽构建的 Keycloak Javascript 适配器比红帽构建的 Keycloak 24 构建的时,请添加
Nonce 后向兼容
映射程序
您可以将协议映射程序直接添加到对应的客户端或某些客户端范围中,客户端应用程序可以依赖红帽构建的 Keycloak Javascript 适配器的旧版本。前面几节中提供了一些更多详细信息,专用于 session_state
和 nonce
声明。