集成三方用户系统

🔗 如何集成自己的用户系统到填鸭表单

若你已有自建用户系统,可以通过加密 Token 的方式无缝接入填鸭表单系统,实现免登录访问和自动用户同步


集成核心思路

利用 URL 参数传递加密后的 token,在填鸭系统中解密并识别用户身份。

  • Token 解密 → 获取用户名
  • 若用户存在 → 自动登录
  • 若用户不存在 → 自动注册 + 赋默认角色
  • 支持 URL 中直接携带 accessToken 实现免登录访问页面

🔧 实现方式说明

已内置支持

系统内置了简易的 Token 解析登录流程,位于:

src/main/java/com/tduck/cloud/account/controller/OtherSystemAuthController.java

如有更复杂的需求(如用户角色映射、多系统同步),你可以扩展以下服务:

src/main/java/com/tduck/cloud/account/service/extra/OtherSystemTokenAuthService.java

🔐 Token 加解密示例(使用 AES)

以 AES 为例,加密明文为用户名 tducktest1,密钥为自定义 base64 编码串。

String content = "tducktest1";

// AES 密钥(Base64 编码)
String base64Key = "g7RrV2Npu1xGj1WDxwEErg==";

// 加密
byte[] encrypt = SecureUtil.aes(Base64.getDecoder().decode(base64Key)).encrypt(content);
String encryptStr = Base64.getEncoder().encodeToString(encrypt);
System.out.println("加密后字符串: " + encryptStr);

// 解密
String decryptStr = SecureUtil.aes(Base64.getDecoder().decode(base64Key)).decryptStr(encryptStr);
System.out.println("解密后用户名: " + decryptStr);

🔎 示例加密结果:

accessToken = VMHrbmtx/wMOKOBqwETCIA==

🧩 接口集成说明

修改逻辑

重写 OtherSystemTokenAuthService#parseToken 方法,返回用户名:

@Override
public String parseToken(String token) {
    // 解密逻辑 → 返回用户名
    String username = SecureUtil.aes(...).decryptStr(token);
    return username;
}

🚀 访问集成示例

页面地址带入参数:

http://localhost:8888/form/my?accessToken=VMHrbmtx/wMOKOBqwETCIA==

系统会自动识别 accessToken,进行解析、登录并跳转目标页面。


🖥️ 前端实现说明

参考以下文件:

  • 路由拦截器逻辑: src/router/index.ts → 第 116 行附近,处理 accessToken 自动登录逻辑
  • 免登录入口组件: src/views/user/login/TokenLogin.vue → 第 22 行,处理接入逻辑

📦 响应数据示例

调用接口后,返回系统 Token 和当前登录用户信息:

{
  "code": 200,
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI...",
    "userInfo": {
      "id": 1001,
      "username": "tducktest1",
      "roles": ["USER"]
    }
  }
}

常见问题

Iframe嵌入后要登录

如果你在测试时发现直接打开链接 ,可以访问到你想要的页面,但是放入到iframe 嵌入到别的系统之后会跳转到登录页面。正常打开链接又不需要。这个是因为浏览器对 iframe 有一定的限制。导致对 token 的写入异常,所以登录状态无法保存。所以跳转到了登录页。要解决该问题,参考如下解决方案。

1. 使用相同主域名

比如部署填鸭表单的域名为 x1.tduckcloud.com

现在你需要在业务系统如 job.tduckcloud.com 中嵌入问卷。这时候你需要保持两个系统在同一个主域名 tduckcloud.com 下。二级域名可以不一致。本地测试时处于 localhost 是无效的。会丢失登录态,需要发布后重试。

2. 使用二级目录

比如你的系统域名为 job.tduckcloud.com 那么把 tduck-x 整个程序作为二级目录放入到job.tduckcloud.com/tduck 下面。作为二级目录。

3. 生成系统内部 token 《3.7 版本开始支持》

如果以上两种方式都不适合你,那么可以使用如下方案。

调用接口,把上文生成的三方 token 通过接口调用系统。会返回系统内部的 token。

curl -X POST 'https://x.tduckcloud.com/tduck-api/user/auth/tokenLogin' -H 'Content-Type: application/json' -d '{
"token":"z8yGviTw3LTDsf9gxPFYnQ=="
}'

返回 数据中包含了一个 token 字段

{
    "code": 200,
    "msg": null,
    "data": {
        "expired": 1778730853062,
        "user": {
        },
        "token": "eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjdkMTlhNzc2LWI0MTQtNDQwYi05Y2I4LWZmNzlkMTYxYzNiOSJ9.klAOZD_GOuJbh1RwA1hqkyNUuOmuI8TdR3jku2-I9kiVmN7rkJ6KFeu0VZypIppNaxvLXuEYaESTyu0tR_Lv1g"
    },
    "success": true
}

使用返回的 token 拼接在 url 上面

http://x.tduckcloud.com/form/my?token=上面返回的 token