跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScriptAI大前端

Coze ChatSDK 纯前端实现会话隔离

解决 Coze ChatSDK 在网页嵌入时不同用户共享会话记录的问题。通过 OAuth 应用为每个用户生成独立的 JWT 令牌,替代硬编码的公共令牌,从而在前端实现用户级会话隔离,无需部署后端服务。

Pythonist发布于 2026/4/6更新于 2026/7/2555 浏览

项目背景

使用 Coze 提供的代码在网页插入智能体后,发现不同用户之间没有实现会话隔离(可以互相看到对话记录)。

虽然官方文档里也给了解决方案,但写得比较粗略,对低代码用户非常不友好,而且示例代码给的是 Python 的,似乎需要部署后端才能实现。

本文介绍一种纯前端实现用户隔离的方案。

实现原理

先来看官方提供的代码:

<script src="https://lf-cdn.coze.cn/obj/unpkg/flow-platform/chat-app-sdk/1.2.0-beta.10/libs/cn/index.js"></script>
<script>
new CozeWebSDK.WebChatClient({
  config: {
    bot_id: '**********', // 智能体 ID
  },
  componentProps: {
    title: 'Coze',
  },
  auth: {
    type: 'token',
    token: 'pat_********', // 访问令牌
    onRefreshToken: function () {
      return 'pat_********'; // 备用访问令牌,可以不填
    }
  }
});
</script>

由于 Coze 是根据令牌来区分对话记录,而我们将令牌写死在代码里,导致所有用户使用的是同一个令牌,看到的也是相同的对话记录。

也就是说,只要给不同用户发不同的令牌,就可以实现用户隔离。

我们可以使用 Coze 提供的 OAuth 应用来为每个用户自动申请新令牌,完整流程如下。

文章配图

前期准备

需要准备以下四个要素:

  • 智能体 ID
  • OAuth ID
  • OAuth 公钥
  • OAuth 私钥

智能体

创建并发布智能体,智能体 ID 可以在地址栏里找到。

文章配图

OAuth

创建 OAuth 应用,类型为服务类应用,保存应用 ID。

文章配图

权限勾选 "Bot 管理"、"会话管理"、"文件"、"消息"。

文章配图

点击创建 Key,保存生成的公钥和私钥,私钥文件用记事本打开即可。

文章配图

完整代码

JavaScript 代码:

// 加载 JWT 生成库并初始化 Coze 智能体,替换你的配置后,加到网页的 js 里
(function() {
  // 配置参数(替换为你的实际信息)
  const COZE_CONFIG = {
    botId: '1145141145141', // 智能体 ID
    appId: '*************', // OAuth ID
    publicKey: '******************************************************', // OAuth 公钥
    privateKey: `-----BEGIN PRIVATE KEY----- ****************************************************** ****************************************************** -----END PRIVATE KEY-----` // OAuth 私钥,全复制进来
  };

  // 加载 JWT 库
  function loadJwtLibrary() {
    return new Promise((resolve, reject) => {
      // 检查是否加载成功
      if (window.KJUR && window.KJUR.jws && window.KJUR.jws.JWS) {
        resolve();
        return;
      }
      const script = document.createElement('script');
      script.src = 'https://cdnjs.cloudflare.com/ajax/libs/jsrsasign/8.0.20/jsrsasign-all-min.js';
      script.type = 'text/javascript';
      script.crossOrigin = 'anonymous';
      // 处理跨域问题
      // 加载成功回调
      script.onload = () => {
        // 验证库是否正确加载
        if (window.KJUR && window.KJUR.jws && window.KJUR.jws.JWS) {
          resolve();
        } else {
          reject(new Error('JWT 库加载但未正确初始化'));
        }
      };
      // 加载失败回调
      script.onerror = () => {
        reject(new Error(`JWT 库加载失败,请检查链接:${script.src}`));
      };
      document.head.appendChild(script);
    });
  }

  // 生成符合 Coze 要求的 JWT
  function generateCozeJwt(userUid) {
    const header = {
      alg: 'RS256',
      typ: 'JWT',
      kid: COZE_CONFIG.publicKey
    };
    const currentTime = Math.floor(Date.now() / 1000);
    const payload = {
      iss: COZE_CONFIG.appId,
      aud: "api.coze.cn",
      jti: Math.random().toString(36).substr(2, 32) + Date.now(),
      iat: currentTime,
      exp: currentTime + 3600,
      session_name: userUid
    };
    const formattedPublicKey = COZE_CONFIG.privateKey;
    return window.KJUR.jws.JWS.sign(header.alg, JSON.stringify(header), JSON.stringify(payload), formattedPublicKey);
  }

  // 获得 Token 并创建 Coze 智能体界面
  async function getAccessToken(jwt) {
    try {
      const response = await fetch("https://api.coze.cn/api/permission/oauth2/token", {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Bearer ${jwt}`
        },
        body: JSON.stringify({
          grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
          duration_seconds: 900
        })
      });
      if (!response.ok) {
        throw new Error(`获取 token 失败,HTTP 状态码:${response.status}`);
      }
      const data = await response.json();
      new CozeWebSDK.WebChatClient({
        config: { bot_id: COZE_CONFIG.botId },
        componentProps: { title: 'Coze AI 助手' },
        auth: {
          type: 'token',
          token: data.access_token,
          onRefreshToken: () => data.access_token
        }
      });
    } catch (error) {
      throw new Error(`获取 Access Token 失败:${error.message}`);
    }
  }

  // 获取用户唯一标识
  function getUserUid() {
    // 从本地存储获取登录用户 ID
    const loggedUserId = localStorage.getItem('website_user_id');
    if (loggedUserId) return loggedUserId;
    // 生成临时访客 ID
    let visitorId = localStorage.getItem('coze_visitor_id');
    if (!visitorId) {
      visitorId = `visitor_${Date.now()}_${Math.random().toString(36).slice(-6)}`;
      localStorage.setItem('coze_visitor_id', visitorId);
    }
    return visitorId;
  }

  // 初始化 Coze 聊天
  function initCozeChat() {
    if (!window.CozeWebSDK || !window.CozeWebSDK.WebChatClient) {
      console.error('Coze SDK 未加载');
      return;
    }
    const userUid = getUserUid();
    const jwtToken = generateCozeJwt(userUid);
    getAccessToken(jwtToken);
  }

  // 加载 Coze SDK
  function loadCozeSdk() {
    const script = document.createElement('script');
    script.src = "https://lf-cdn.coze.cn/obj/unpkg/flow-platform/chat-app-sdk/1.2.0-beta.10/libs/cn/index.js";
    script.onload = initCozeChat;
    script.onerror = () => console.error(`Coze SDK 加载失败:${COZE_CONFIG.sdkSrc}`);
    document.head.appendChild(script);
  }

  // 初始化流程
  async function init() {
    try {
      await loadJwtLibrary();
      loadCozeSdk();
    } catch (error) {
      console.error('初始化失败:', error.message);
    }
  }

  // 页面加载完成后初始化
  if (document.readyState === 'complete') {
    init();
  } else {
    window.addEventListener('load', init);
  }
})();

测试网页示例:创建一个 HTML 文件,将上述代码插入 <script> 标签中。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Coze 智能体测试页面</title>
</head>
<body>
<div>
<div>
<h1>Coze 智能体测试页面</h1>
</div>
</div>
<script>
// 在此插入上述代码
</script>
</body>
</html>

成功加载后应显示如下界面,并且实现了用户对话隔离:

文章配图

安全提示

由于直接把公钥和私钥写在了 JS 里,存在一定安全风险。建议在生产环境中结合后端代理进行密钥管理,仅在前端演示或低风险场景下采用此方案。

目录

  1. 项目背景
  2. 实现原理
  3. 前期准备
  4. 智能体
  5. OAuth
  6. 完整代码
  7. 安全提示
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • OpenClaw 多 Agent 与多飞书机器人配置指南
  • Planning with Files:基于文件的 AI 代理规划工作流实践
  • RAG 四大模式解析:Naive、Advanced、Modular 与 Agentic
  • OpenClaw 本地优先智能体框架架构与工程实践
  • FreeCAD Python API 入门与实战指南
  • 车载AVM开发实战:图像滤波与畸变矫正的C++实现
  • Python 编写小游戏教程:7 个经典案例源码
  • 使用 Trae IDE 与 MCP Server - Figma AI Bridge 将 Figma 转为前端代码
  • AI 自动化测试:接口测试全流程自动化的实现方法
  • IntelliJ IDEA 中 GitHub Copilot 安装与实战技巧
  • LeetCode 54. 螺旋矩阵
  • llama-cpp-python 完整安装与配置指南
  • PPT 中嵌入 VR 全景图片的实操指南
  • Ubuntu(arm64)设备上安装 chromium 浏览器
  • 前端安全实战:密码加密与常见攻击防护
  • OpenClaw Secure DM Pairing 机制解析与安全私信访问配置
  • 知识图谱与大模型结合:构建智能应用新生态
  • MyBatisPlus 与 Thymeleaf 全栈分页整合方案
  • 大模型时代企业 AI 发展趋势分析
  • OpenClaw 微信通道插件接入与配置指南

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online