避免 publish token 暴露)
WeKnora 网页嵌入渠道怎么配置安全模式Secure Mode避免 publish token 暴露【免费下载链接】WeKnoraOpen-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki.项目地址: https://gitcode.com/GitHub_Trending/we/WeKnora如果你要把 WeKnora 的知识库问答挂件嵌到自己的网站或帮助中心默认的静态 Token 模式会把发布 Tokenem_前缀直接写进页面 HTML——任何访客「查看源代码」就能复制走。安全模式Secure Mode解决的就是这个问题长期密钥只保存在你自己的业务后端访客浏览器里只有 30 分钟有效的短时令牌ems_前缀由你的后端代理向 WeKnora 换取。完成本文后你会得到一套配置页面脚本里不含任何长期 TokenWidget 能自动续期短时令牌且未登录访客无法换取令牌。前提是你已部署一个可被浏览器访问的 WeKnora 实例根路径提供weknora-widget.js并有一个可以新增 HTTP 接口的业务后端全链路走 HTTPS。两种接入方式的区别Token 放在哪方式发布 Token 在哪风险iframe / 普通 Widget静态模式写在页面 HTML 或 URL hash 里任何人「查看源代码」就能复制等于公开密钥安全模式 Widget仅环境变量 / 密钥管理在服务端浏览器拿不到长期密钥还可先校验访客是否登录两种模式使用的 Token 体系Token前缀生命周期用途Publish Tokenem_长效直到轮换渠道发布令牌安全模式下仅保存在业务后端用来换短时令牌Session Tokenems_30 分钟Redis TTL由 publish token 通过/exchange换取浏览器侧使用静态模式data-tokenem_...适合内部站点或低敏感场景生产环境对外嵌入应优先用安全模式。第 1 步在 WeKnora 创建渠道并记录密钥在管理端「设置 → 网页嵌入」新建渠道绑定要对外提供问答的智能体然后记下两样东西渠道 IDUUID发布 Tokenem_…在管理端「渠道密钥」处查看创建渠道时同时配置两项后面会反复用到域名白名单allowed_origins——必填至少一项。它校验的是 API 请求的Origin头不是「允许哪些网站粘贴脚本」。安全模式下通常需要填两条要放行的请求来源白名单示例聊天 iframe 所在源站embed 页面https://app.example.com或https://embed.example.com你的取令牌后端exchange 时带的 Originhttps://shop.example.com支持三种形式完整http(s)://Origin、子域名通配*.example.com、全通配*仅开发模式允许生产环境拒绝。开发环境可临时使用*生产环境禁止*。限流——单 IP 每分钟上限默认30渠道每日总量默认10000渠道全局每分钟还有max(单IP上限 × 20, 120)的兜底防止轮换 IP 绕过单 IP 限流。敏感智能体不要图省事退回静态模式。第 2 步在业务后端部署取令牌接口在你的业务后端新增一个 HTTP 接口路径自定Widget 会用它。文档给出的接口要求入参浏览器的 GET 请求你必须做校验调用方是合法访客Session Cookie、JWT 等未登录返回401用发布 Token 调 WeKnora 的 exchange 接口成功时返回 JSON{ token: ems_…, expiresIn: 1800 }。exchange 的调用约定POST https://weknora-host/api/v1/embed/channel_id/exchange Authorization: Embed 发布 Token em_… Origin: https://你的业务站点 ← 须与渠道白名单一致否则 403注意服务端fetch默认不带Origin头需要手动设置与白名单匹配的Origin。exchange 只接受 publish token误用ems_会话 Token 会被拒绝成功响应形如{ success: true, data: { session_token: ems_..., expires_in: 1800 } }下面是文档给出的 Node.jsExpress服务端示例。其中WEKNORA_HOST、CHANNEL_ID替换为你的实际值shop.example.com是文档示例值换成你的业务站点域名且必须与白名单一致。发布 Token 放环境变量WEKNORA_PUBLISH_TOKEN不要写进前端静态包const WEKNORA_BASE https://WEKNORA_HOST; const CHANNEL_ID CHANNEL_ID; const ALLOWED_ORIGIN https://shop.example.com; // 与渠道白名单一致 app.get(/weknora/embed-token, async (req, res) { const hasSession Boolean(req.cookies?.session_id); const auth req.headers.authorization || ; if (!hasSession !auth.startsWith(Bearer )) { return res.status(401).json({ error: unauthorized }); } const r await fetch(${WEKNORA_BASE}/api/v1/embed/${CHANNEL_ID}/exchange, { method: POST, headers: { Authorization: Embed process.env.WEKNORA_PUBLISH_TOKEN, Origin: ALLOWED_ORIGIN, }, }); const body await r.json(); if (!body?.data?.session_token) { return res.status(502).json({ error: mint failed }); } res.json({ token: body.data.session_token, expiresIn: body.data.expires_in }); });如果你用 Godocs/embed-secure-mode.md 里还有一段net/http版本的embedTokenHandler示例逻辑相同。管理端「安全模式」Tab 也会按当前渠道 ID 生成带真实 URL 的页面脚本和服务端代码片段可直接复制。第 3 步在页面粘贴安全模式 Widget 代码Widget 是一个无依赖的 loader 脚本weknora-widget.js负责渲染悬浮按钮 iframe 面板iframe 指向/embed/{channel_id}。安全模式下用data-token-endpoint指向你的取令牌接口不带data-tokenscript srchttps://your-weknora.example.com/weknora-widget.js contenteditable="false">【免费下载链接】WeKnoraOpen-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki.项目地址: https://gitcode.com/GitHub_Trending/we/WeKnora创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考