51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

【最佳实践】如何将 DataEase 嵌入第三方系统(附 API 调用说明及示例代码)

注意:本文介绍内容适用于 DataEase V1 版本,V2 版本嵌入式介绍请查看官方直播回放: DataEase嵌入式版介绍 (vhall.com)

1 需求介绍 {#heading-1}

将 DataEase 嵌入第三方系统(为方便描述,本文将第三方系统统一称为 A 系统)

要求将 DataEase 作为 A 系统中的某个菜单项,菜单点击后在页面嵌套打开 DataEase 页面并操作。效果示意图如下:
image-1663053583337

2 方案概述 {#heading-2}

DataEase 是支持使用 iframe 嵌套到第三方系统中的,关键问题在于如何统一两个系统的用户认证,即:用户在 A 系统中打开 DataEase 系统时,无需再次登录,DataEase 自动登入 A 系统中的账户。

目前有两种方案,单点登录和模拟登录。

单点登录指:使用支持 OIDC 或 CAS 协议的系统作为统一登录平台,A 系统与 DataEase 全部对接同一个单点平台实现只需一次登录就可访问两个系统,即 单点登录(SingleSignOn,SSO)

模拟登录指:A 系统后台请求 DataEase 的登录接口,将登录成功的 Token 写入 Cookie 中,来模拟用户登录的过程,省去用户自己输入密码登录的过程。模拟登录又分同域和跨域两种方式,文章中会详细介绍。


使用单点登录方式是 DataEase 原生支持的用户登录集成方式,仅需修改前端 iframe 嵌套。使用单点登录方式用户可使用同一个用户密码登录两个平台,DataEase 中不存在的用户登录时会自动创建。单点登录方式使用配置更方便,是比较推荐的方式。

但有时受限于实际情况,比如没有搭建 SSO 系统,这时则可使用模拟登录方式,需要做一些开发,同样可以实现集成。


3 使用单点登录对接方式介绍 {#heading-3}

3.1 流程描述 {#heading-4}

目前 DataEase 支持 OIDC、CAS 协议

通过单点登录方案集成嵌入 DataEase 方案整体流程如下:
image-1663053638579

前置条件

A 系统与 DataEase 均已对接同一个单点登录系统

  1. 用户通过单点登录系统登入 A 系统

  2. 用户点击菜单项,访问 DataEase 系统

  3. DataEase 通过单点登录系统获取到当前登录用户自动登入并重定向至 DataEase 首页

  4. 用户在 A 系统 WEB 页面通过 iframe 嵌套使用 DataEase 系统功能。

3.2 配置指南 {#heading-5}

  1. 配置 OIDC 或 CAS
    image-1663053678370

  2. 默认登陆方式修改为 OIDC
    image-1663053701238

  3. 单点登录配置好后,在 A 系统中使用 iframe 地址访问 DataEase 地址即可

4 同域模拟登录方案介绍 {#heading-6}

同域是指 A 系统与 DataEase 在同一父域名下。比如 a.fit2cloud.comde.fit2cloud.com 它们都是 fit2cloud.com 的子域名。这种情况下,a.fit2cloud.com 可以将 cookie 信息存放在 fit2cloud.com 域名下,de.fit2cloud.com 也可以获取 fit2cloud.com 域名下的 Cookie,以此实现模拟登录认证。

4.1 流程描述 {#heading-7}

image-1663053727988

  1. 用户登录 A 系统

  2. 用户在 A 系统中通过 iframe 访问 A 系统的模拟登录接口

  3. A 系统根据已登录的用户信息请求 DataEase 的用户查询接口,获取到 DataEase 系统中对应的用户 ID

  4. A 系统根据用户 ID 调用 DataEase 的用户密码修改接口,修改用户密码

  5. A 系统调用 DataEase 的模拟登录接口获取 Token

  6. A 系统将 Token 写入 Cookie 中,并重定向至 DataEase 页面(当浏览器 Cookie 中存在 Token 时访问 DataEase 便不再需要认证)

  7. 用户在 A 系统 WEB 页面通过 iframe 嵌套使用 DataEase 系统功能。

4.2 开发指南 {#heading-8}

此方案需要 A 系统提供一个模拟登录接口,并且在登录前修改 DataEase 中的用户密码以保证模拟登录成功。

由于模拟登陆是使用 Cookie 来实现,所以需要保证 A 系统与 DataEase 处于同一个根域名下。

4.2.1 DataEase 提供的接口 {#heading-9}

  1. API 认证方式

DataEase 接口调用时需要在请求 Header 中传递 accessKey 和 signature

image-1663053766971其中 accessKey 为下图中的 Access Key 的值,Access Key 和 Secret Key 获取方式如下图所示。
image-1663053793120

signature 为 Access Key 和 Secrent Key 拼接后使用 AES 加密计算出的结果,计算方式如下
image-1663053864033

提示

图示代码可参考此链接:DataEaseLoginController.java at main · liuboF2c/dataease-login-adpter-demo (github.com)

  1. 用户查询接口

    由于修改用户密码接口需要使用用户 ID,我们需要先使用用户查询接口 /api/user/transAccount 获取用户 ID。

接口返回信息中的 data 即 userId。

  1. 修改用户密码接口

通过用户 Id 修改接口修改用户密码。此处请求参数中的 userId 为上一步返回值中获取到的 userId。请求参数中的 newPassword 在 1.18.8 之后的版本中需要使用 Base64 加密后的字符串,在 1.18.7 及之前的版本中填写密码原文即可。
image-1663053950603

  1. 登录接口

使用登录接口可获取到 Token,将 Token 放入浏览器 Cookie 中后访问 DataEase 便不再需要登录认证
image-1663053970126

登录接口中的 password 和 username 均需使用 RSA 加密,加密秘钥取自 DataEase 源码中 application.properties 文件
image-1663053984789

加密方式如下
image-1663054065031

提示

图示代码可参考此链接:DataEaseLoginController.java at main · liuboF2c/dataease-login-adpter-demo (github.com)

4.2.2 嵌套对接示例代码 {#heading-10}

基于以上接口,我们就可以实现将 DataEase 嵌入第三方系统。

我写了一个 demo 示例(下称 demo 系统)供大家参考:DataEase 模拟登录对接(github.com)

使用此示例需注意以下事项:

  1. demo 系统必须与 DataEase 处于同一域名下。

你可以通过修改本地 hosts 文件来实现。比如我测试时在 /etc/hosts 中添加了如下映射:

hosts
127.0.0.1 localhost.fit2cloud.com
10.2.3.23 edu.fit2cloud.com
  1. 启动前,需要修改 demo 系统代码,填充 DataEaseLoginController 中的变量值
    image-1663054093826

  2. 页面嵌套参考如下代码,ifreame 中的 src 配置为后端的模拟登陆地址
    image-1663054103108

  3. 在 A 系统登出时,需清除 Cookie,否则 DataEase 中的用户不会退出登录
    image-1663054111827

退出登录代码
image-1663054120441

  1. 跨域模拟登录方案介绍 {#heading-11} ===========================

跨域是指 A 系统与 DataEase 不在 同一父域名下。比如 cmp.fit2cloud.comdemo.dataease.tech 这两个域名。这种情况下,两个域名之间无法共享 Cookie ,所以无法使用同域模拟登录来嵌入。此时可以通过添加一个 Nginx 来代理 DataEase,这样 Nginx 和 DataEase 在同一域名下,在 A 系统认证通过后,将 Token 以重定向形式转发到 Nginx 后将其写入 Cookie 中。

**注:**如果你的服务器没有配置域名,使用 IP 直接访问,配置自签名证书后也可使用此方案。


5.1 流程描述 {#heading-12}

1. 用户登录 A 系统

  1. 用户在 A 系统中通过 iframe 访问 A 系统的模拟登录接口

  2. A 系统根据已登录的用户信息请求 DataEase 的用户查询接口,获取到 DataEase 系统中对应的用户 ID

  3. A 系统根据用户 ID 调用 DataEase 的用户密码修改接口,修改用户密码(修改密码是为了保证模拟登录的稳定性,防止用户自行修改密码导致模拟登录失败,如果能够保证用户不修改密码,此步骤可省略。)

  4. A 系统调用 DataEase 的模拟登录接口获取 Token

  5. A 系统给浏览器发送重定向响应(重定向示例:https://demo.dataease.tech/sso/login-template.html?token=xxx),将 Token 携带在重定向地址中

  6. 浏览器请求重定向地址,重定向至 Nginx 中的 login-template.html 页面

  7. Nginx 将 login-template.html 网页内容返回浏览器,浏览器加载后将执行 js 代码,解析 Token 并将 Token 设值到 Cookie 中

  8. 用户在 A 系统 WEB 页面通过 iframe 嵌套使用 DataEase 系统功能。

5.2 开发指南 {#heading-13}

此方案需要 A 系统提供一个模拟登录接口,并且在登录前修改 DataEase 中的用户密码以保证模拟登录成功。

由于模拟登陆是使用 Cookie 来实现,在嵌入场景下需要使用 Nginx 来代理 DataEase,然后在 Nginx 中配置一个静态页面写入 Cookie 来实现自动认证。

注意: 目前所有浏览器厂商为了安全考虑,都对 iframe 跨域场景的操作加了限制。对于 iframe 中嵌入的平台,必须使用 HTTPS 协议才能正常使用。因为跨域的场景下,要在 iframe 中写入 Cookie,需要增加 SameSite=None;Secure; 属性,而添加了 Secure 属性就要求必须使用 HTTPS 协议,因此当 DataEase 使用 HTTP 协议时,iframe 嵌套场景无法把 Cookie 设置到 DataEase 所在的域名下。

5.2.1 DataEase 提供的接口 {#heading-14}

请参阅 4.2.1

5.2.2 嵌套对接示例代码 {#heading-15}

跨域嵌入也可参考此示例代码:DataEase 模拟登陆对接 (github.com)

使用此示例跨域场景需注意以下事项:

  1. 配置 Nginx

由于 A 系统与 DataEase 不在同一域名下,DataEase 不直接对外提供服务,所有外部环境使用 Nginx 代理访问 DataEase。

同时 Nginx 需要配置 SSL 认证,如果没有证书,可以使用自签名证书替代。SSL 配置可参考:【安装部署】配置 DataEase 使用 https 访问 - FIT2CLOUD 知识库。

此外,Nginx 还需要配置一个静态网页,用于设值 Cookie 用。Nginx 配置参考如下:


|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | location / { proxy_pass <DataEase服务器地址> proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /sso { # 请将此配置 [./src/main/resources/templates] 修改为 login-template.html 存放路径 # login-template.html 取自示例代码的 src/main/resources/templates/ 目录 # 将其与 nginx 放置于同一服务器,然后在 nginx 配置文件中将此配置项填写为 login-template.html 的所在目录; alias ./src/main/resources/templates index login-template.html; } |


  1. 启动前,需要修改 demo 系统代码,填充 DataEaseLoginController 中的变量值

3. 页面嵌套参考如下代码,iframe 中的 src 配置为后端的模拟登陆地址

4. 在 A 系统登出时,需调用 DataEase 系统登出接口,否则 DataEase 中的用户不会退出登录

赞(6)
未经允许不得转载:工具盒子 » 【最佳实践】如何将 DataEase 嵌入第三方系统(附 API 调用说明及示例代码)