画布连接参数
重要声明
为了提供更好的画布集成体验,我们推出了更轻量级的 Token 接入画布模式,详情请参考文档。 后续我们也会计划逐步淘汰本文描述的画布连接参数接入模式。
什么是画布连接参数 ?
画布 Web SDK 需要连接至英飞服务端来进行画布数据的同步与存储,在这个过程中,画布参数发挥了重要的作用。 画布连接参数的本质是一个类似 Url search params 格式的字符串。该字符串内包括了诸如应用 ID,用户信息、签名等重要信息。 画布 连接参数提供了以下功能:
- 基于加密签名机制,通过校验画布连接参数本身,来判断校验画布使用合法性。校验不通过则无法正常使用画布能力。
- 提供 appId、recordId(画布 uuid)、画布长链接有效时长等画布链接相关信息
- 提供用户 ID、用户类型、用户名称等画布使用者信息
- 操作历史、画布版本等画布功能信息
画布连接参数推荐由开发者自己的服务器生成,因为这样可以避免直接将 appSecret 基于网络进行传输。开发者自己的服务端应自行妥善存储 appSecret 数据,并基于 appSecret 生成签名,这样英飞服务端就能仅依靠签名机制验证画布使用者的访问合法性。而为了减少画布连接参数本身暴露造成的风险,连接参数的有效时长应尽可能短一些,这样即便泄漏,也无法持续产生危害。
画布连接参数生成方式
画布连接参数列表
计算签名与画布连接参数方式
画布连接参数的签名与 Restful API 签名的生成方式基本一致,首先将上述表格中的各参数(除 signature 外)以 参数名称=参数值
形式用 &
拼接成字符串,再通过 HMAC-sha1
签名并以 Hex
格式输出,即可得到签名值。
Node 环境下 JS 示例:
// 存储于服务端的 appSecret
const signKey = "APP_SECRET";
// 包含全部必要画布连接参数的对象
const params = { appId: 'testId', ... };
// 将参数名与参数值拼接,并连接成 Url Search Params 字符串
const content = Object.keys(params).sort().map(key => `${key}=${params[key]}`).join('&');
// 使用分配的应用秘钥来加密生成签名
const signature = crypto.createHmac('sha1', signKey).update(content).digest('hex').toUpperCase();
const enrichedParams = { ...params, signature };
// 生成画布连接参数
const queryString = Object.keys(enrichedParams).sort().map(key => `${key}=${encodeURIComponent(params[key])}`)
画布连接参数示例:
appId=test&crypto=1&loginName=user_1&ownerLoginName=user_1&recordId=test_id&signature=signature_value&validBegin=1698390089&validTime=10800
快速集成画布连接参数生成能力
为方便 Node 服务端开发者快捷生成画布连接参数,我们提供了可以基于 npm 引入的工具库:
- 安装依赖:
npm i @plaso-infi/whiteboard-ext-tools
- 使用工具函数
// @plaso-infi/whiteboard-ext-tools 库自带 d.ts 类型声明
import { getInfiWebsdkQuery, type WebsdkQueryParams } from "@plaso-infi/whiteboard-ext-tools";
// WebsdkQueryParams 会对画布连接参数做类型检查
const queryParams: WebsdkQueryParams = {...};
// 获取完整画布连接参数
const queryString = getInfiWebsdkQuery(queryParams);
使用画布连接参数
如果您已经基于上文说明完成了画布链接参数的生成,您可以将参数通过网络下发给您的前端应用,再经由您的前端应用将画布链接参数注入英飞画布 Web SDK 并完成 SDK 的初始化动作。 鉴于画布连接参数具有时效性,且用户在前端可能会长时间使用画布,我们建议您在前端集成时,可以通过 HTTP 请求的方式,确保随时可以获取到最新的、有效的画布连接参数,例如:
const getQueryString = () => {
// 从您的服务端获取到最新且有效的画布连接参数
return fetch('...').then(...);
}
const initPromise = await InfiWebSdk.getSdkInstance({
/** 画布会在尝试重连服务器时,获取最新的画布连接参数,确保能够正常与英飞画布云服务进行通信 */
getQueryString,
...
});