跳到主要内容 跳到补充内容

迁移插件

并非所有插件都以相同的方式实现。考虑将以下内容作为指南,其概述了插件迁移过程中涉及的一些注意事项。在尝试迁移插件之前,请确保已完成以下操作:

  • 您已部署并配置 Qlik Cloud 租户。

  • 用户可以通过 Idp 进行身份验证,并且所需的应用程序已迁移到适当的共享或管理空间,用户至少具有“可以查看”权限。有关空间权限的信息,请参阅管理共享空间中的权限管理托管空间中的权限

  • 使用租户管理员角色访问租户(创建 Web 集成所需)。

您还应该熟悉 Qlik Sense 插件通常是如何使用 JavaScript 和 HTML 实现的,无论它们是使用 IFrames 还是使用 Qlik Capability API 的嵌入对象。

为了清楚起见,新插件将引用 Qlik Cloud 中的插件,旧插件将参考 Qlik Sense 客户端托管 中的现有插件。

Web 集成

您的 Qlik Cloud 中的新插件将从您的 Qlik Cloud 租户而不是 Qlik Sense 客户端托管 加载和嵌入内容。 您必须在 Qlik Cloud 中配置 Web 集成,以便它可以识别您的插件网站(源)。

Web 集成是一种安全机制,允许呈现与 URL 包含列表相关联的有效 ID 的网站,以呈现嵌入的可视化。与 Qlik Cloud 交互的任何 Web 应用程序都需要在您的租户中配置 Web 集成。

Qlik Cloud 中创建 Web 集成

您必须是 Qlik Cloud 中的租户管理员才能创建 Web 集成。

执行以下操作:

  1. 管理控制台 中,转到 Web 部分,然后单击右上角的新建
  2. 在对话框中,为 Web 集成命名。

  3. 以下面的格式键入源的地址:https://domain.com. 然后单击添加将源添加至许可名单。

    信息注释您可以添加多个原点。
  4. 单击创建
创建 Web 集成

创建 Web 集成后,您将获得一个 ID。这是插件的 qlik web 集成 ID,它是新插件代码中的必需属性或参数。

Web 集成 ID

示例 Web 集成 ID

有关创建 Web 集成的详细信息,请参阅管理 Web 集成

身份验证

Qlik Sense 客户端托管 中的插件通常通过虚拟代理处理身份验证,其中预配置了身份验证机制。选项包括 Header、Ticket、SAML、JWT、OpenID Connect ( OIDC) 以及 Anonymous 等等。有关详细信息,请参阅身份验证解决方案 (仅提供英文版本)

在您的 Qlik Sense 客户端托管 旧插件中,通常在通过此虚拟代理加载任何资源(包括必要的静态 Qlik 文件和库)之前,在代码中处理身份验证。

例如:

  • 对于 Ticket 和 JWT,通常会调用后端身份验证模块来安全地创建 Qlik 票证或 JWT 令牌。

  • 对于 Header,某些底层模块或反向代理设置适当的标头。

  • 对于 OIDC 和 SAML,必须有一个初始重定向到相应的身份提供程序,该身份提供程序将触发身份验证流以最终启动与 Qlik Sense 的会话,这样它才能加载资源并开始嵌入内容。

Qlik Cloud 不使用虚拟代理。相反,它使用您在租户中创建的 Web 集成。对于身份验证,可以使用以下两种机制: 

  • 交互式登录 - 此机制依赖于租户用于常规访问的已配置 IdP。默认情况下,此项为 Qlik Account IdP,或任何可用选项,如 Okta、Auth0、ADFS、AzureAD、Salesforce、Generic 和Keyclock。

  • JSON Web Tokens (JWT)—这种身份验证机制依赖于通常由后端服务安全生成的已签名 JWT 令牌。在这种情况下,应该在 JWT 类型的租户中配置一个身份提供程序。

其中 Qlik 对象使用 Capability API 嵌入的插件

使用交互式登录进行身份验证

HTML 潜在代码更新

Qlik Sense 客户端托管 插件一样,必须在 html 中的 <head> 部分加载两个 Qlik 静态文件(qlik-styles.cssrequire.js)。但是,对于 Qlik Cloud,这些文件可以直接访问,无需身份验证。

HTML 潜在代码更新

JavaScript 潜在代码更新

如果 Qlik Sense 客户端托管 插件使用 Capability API 嵌入 Qlik Sense 客户端托管 上的对象并与之交互,请查看以下代码,在本例中,该代码使用 Capability API Qlik 库嵌入了多个可视化。

JavaScript 潜在代码更新

require 的配置变量和 baseUrl

对于新的 Qlik Cloud 插件,配置变量必须反映租户主机webIntegrationId。此外,由于没有虚拟代理,前缀应该是 /。您可以设置一个身份属性,以便会话不共享,并且仅用于此插件的上下文。端口必须为 443,这意味着 isSecure 始终为 true。

require 配置应该包含您的 webIntegrationId,而 baseUrl 更简单,因为到 Qlik Cloud 的通信始终通过端口 443 上的 https。

require 的配置变量和 baseURL

加载 Capability API

在用 require (js/qlik) 加载 Qlik Capability API 库之前,请检查用户是否已登录。例如,这可以通过触发当前用户元数据端点的 RESTAPI 调用来实现。如果响应状态不是 200,则代码必须重定向到登录屏幕,在 URL 中注入两个参数:returnto(实际的插件 URL)和qlik-web-integration-id

代码执行如下:

  • 检查用户是否已使用 GET 请求登录 /api/v1/users/me REST API 端点。

    • 如果是否定的(响应状态不是 200),则重定向到登录屏幕/登录,添加 return to 和 qlik-web-integration-id 参数。

    • 如果是肯定的(响应状态为 200),使用 require 加载 qlik/js Capability API 库,然后继续使用这组 API。

最后的代码可能与以下示例类似。对于 JavaScript,没有一种独特的方法可以编写完美的代码,因此这只是一种有效的代码选项。

使用 JSON Web 令牌 (JWT) 进行身份验证

配置 JWT 身份提供程序

JWT 令牌是对某些有效负载用户元数据(如姓名、电子邮件、组、主题)进行加密的结果,这些元数据使用证书私钥进行安全签名。具有相关证书公钥的任何人都可以验证令牌并读取其中的用户信息。

Qlik Cloud 要验证已签名的 JWT 令牌,必须在 JWT 类型的 Qlik Cloud 租户中配置身份提供程序。一旦配置好,租户就可以接受和验证包含正确签名的承载 JWT 令牌的 API 请求。

  1. 在管理控制台中,从配置部分选择身份提供程序以创建新的身份提供程序。

    创建 JWT 类型的身份提供程序配置

  2. 将 PEM 格式的证书公钥粘贴到上面的证书框中。

  3. 或者,您可以指定发布者密钥 ID,创建后将向您提供这些值。

    身份提供程序配置的发布者和密钥 ID

签名 JWT 令牌后端服务潜在代码更新

对于 Qlik Sense 客户端托管,生成 JWT 令牌的有效负载只需要声明用户 ID 和用户目录,这是 JWT 身份验证的 Qlik Sense 中的虚拟代理所需要的。使用 Qlik Cloud 时,此有效负载需要更多不同的声明属性。

您必须调整负载的 JWT 令牌生成后端服务代码,以及必要的签名选项,以反映 Qlik Cloud 所需的内容。例如,JWT 身份提供程序的发布者和密钥 ID 是强制签名选项。完整描述请参见 Qlik Sense 授权的 JWT 格式

HTML 潜在代码更新

Qlik Sense 客户端托管 插件一样,必须在 html 中的 <head> 部分加载两个 Qlik 静态文件(qlik-styles.cssrequire.js)。但是,对于 Qlik Cloud,这些文件可以直接访问,无需身份验证。

JavaScript 潜在代码更新

代码概念类似于使用交互式登录。但是,在这种情况下,您必须通过 POST 请求向 /login/jwt-session 端点启动 JWT 会话,并传递承载 JWT 令牌的标头和 Web 集成 id,而不是重定向到常规登录屏幕。

  • 检查用户是否已使用请求登录 /api/v1/users/me REST API 端点。

    • 如果是肯定的(响应状态为 200),则加载并通过 require 使用 qlik/js Capability API 库。

    • 如果是否定的(响应状态不是 200),则触发 POST 请求以使用给定的已签名 JWT 令牌启动 JWT 会话。

      • 如果是肯定的,则加载并通过 require 使用 qlik/js Capability API 库。

      • 如果是否定的,则 JWT 验证可能失败,因为 JWT 无效、过期或未被接受。

以下是上述过程的代码示例。

Qlik Cloud 中的 Capability API 和兼容性

尽管在为 Web 应用程序使用 Capability API 时 Qlik CloudQlik Sense 客户端托管 之间几乎完全兼容,但如果您将此 JavaScript 库用于具有 Qlik Cloud 部署的网站,则会有一些细微的差异或不可用的方法。例如,全局 API 在 Qlik Cloud 中不可用。

Qlik 对象使用 IFrames 嵌入的插件

除了按 其中 Qlik 对象使用 Capability API 嵌入的插件 中所述处理身份验证之外,您还必须熟悉 Qlik Cloud 如何处理内容安全策略 (CSP)。

内容安全政策

Qlik Cloud 中的 CSP 策略阻止访问其他域中的 Qlik 对象。这意味着当使用 Single API IFrame 方法嵌入 Qlik 对象时,您将得到帧祖先的 ‘self’策略错误。

策略错误:frame-ancestors 'self'

请参阅内容安全策略,了解如何配置 CSP,以便插件可以使用 IFrames 嵌入 Qlik Cloud 对象。

使用 enigma.js 的插件

enigma.js 库帮助您在 JavaScript 环境中与 Qlik 关联引擎 进行通信。

除了所需的 Web 集成和用户身份验证处理之外,在 Qlik 上使用 enigma.js 时还必须考虑跨站点请求伪造 (CSRF) 概念。

跨站点请求伪造 (CSRF)

Qlik Cloud 具有防止跨站点请求伪造 (CSRF) 的对策。与 Qlik Cloud 交互的任何 Web 解决方案都必须在所有非 GET REST 调用(包括 WebSocket 连接)上提供有效的 CSRF 令牌。

在 Web 应用程序中使用 enigma.js 时,无论是在后端还是前端代码中,都会创建 WebSocket 连接。这意味着需要将 CRSF 令牌作为 WebSocket 连接的一个参数,以便 enigma.js 库通过 Qlik Cloud 打开安全会话。

一旦用户登录,就可以向 /api/v1/csrf-token 端点请求有效的 CSRF 令牌。

下面是在前端代码中使用了 enigma.js(用于打开应用程序并获取布局)的代码示例(带有登录用户)。

要查看完整的代码示例,请查看以下教程:

Visit the discussion forum at community.qlik.com

本页面有帮助吗?

如果您发现此页面或其内容有任何问题 – 打字错误、遗漏步骤或技术错误 – 请告诉我们如何改进!