集成三方用户系统
🔗 如何集成自己的用户系统到填鸭表单
若你已有自建用户系统,可以通过加密 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 上面