扣子智能体websdk集成多会话模式

扣子智能体websdk集成默认PAT是不安全的,官方也推荐使用JWT认证,就涉及到服务端集成OAUTH认证。另一个是默认PAT集成,每个人打开同一个session对话,并不满足实际生产环境需求。

配置

First, 云端创建一个 OAuth应用 [服务类应用],如下:

303094dbbd2b2117a05c8d5f1e3915a6

具体进一步的操作是

11318ea88f38b5b2bfc7e5124eece671

服务端集成

在服务端代码我们一版maven构建机制,修改如下源代码,示例代码在这儿,基于javalin, 同样也可改造为基于SpringBoot框架

java 复制代码
"/token",
ctx -> {

// 处理OAuth回调并获取访问令牌

try {

OAuthToken tokenResp = oauthClient.getAccessToken(UUID.randomUUID().toString());

ctx.sessionAttribute(genTokenSessionKey(), tokenResp);

Map<String, String> model = new HashMap<>();

model.put("token_type", tokenResp.getTokenType());

model.put("access_token", tokenResp.getAccessToken());

model.put("refresh_token", "");

model.put(

"expires_in",

String.format(

"%d (%s)",

tokenResp.getExpiresIn(),

timestampToDateTime(tokenResp.getExpiresIn())));

if ("XMLHttpRequest".equals(ctx.req.getHeader("X-Requested-With"))) {

ctx.json(model);

return;

}

String html = formatHtml(readFromResources("websites/callback.html"), model);

ctx.contentType("text/html");

ctx.result(html);

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException("Authorization failed: " + e.getMessage());

}

})

Spring版本适配jar文件运行

java 复制代码
/**
 * OAuth 2.0 认证令牌服务实现类
 * 提供与 Coze 平台集成的 JWT 令牌管理功能
 * 处理认证流程中的配置加载、临时文件创建、会话管理和令牌刷新等核心操作
 */
@Service
@Slf4j
public class OAuthTokenServiceImpl implements OAuthTokenService {

    // 配置文件相关常量
    private static final String configFilePath = "coze_oauth_config.json";
    public static final String XMLHTTP_REQUEST = "XMLHttpRequest"; // AJAX 请求标识头
    public static final String X_REQUESTED_WITH = "X-Requested-With"; // 请求来源标识
    public static final String AUTH_TOKEN = "auth_token"; // 会话中存储的 token 键名
    public static final String D_S = "%d (%s)"; // 过期时间格式字符串
    private static final String CONFIG_PATH = "classpath:coze_oauth_config.json"; // 配置文件路径
    private static final String TEMP_FILE_PREFIX = "coze_oauth_config_"; // 临时文件前缀
    private static final String TEMP_FILE_SUFFIX = ".json"; // 临时文件后缀

    // 依赖注入资源加载器
    @Autowired
    private ResourceLoader resourceLoader;

    // 私有字段
    private JWTOAuthClient jwtoAuthClient; // JWT 认证客户端实例
    private File tempConfigFile; // 用于存放配置的临时文件

    /**
     * 初始化方法,在 bean 构造完成后执行
     * 根据环境选择直接使用配置文件或创建临时文件来加载认证配置
     * @throws Exception 如果初始化失败
     */
    @PostConstruct
    public void init() throws Exception {
        Resource resource = resourceLoader.getResource(CONFIG_PATH);

        // 开发环境直接使用文件路径
        if (resource.isFile()) {
            jwtoAuthClient = JWTOAuthClient.loadFromConfig(
                    new LoadAuthConfig(resource.getFile().getAbsolutePath())
            );
            return;
        }

        // 生产环境创建临时文件
        createTempFile(resource);
        jwtoAuthClient = JWTOAuthClient.loadFromConfig(
                new LoadAuthConfig(tempConfigFile.getAbsolutePath())
        );
    }

    /**
     * 创建临时文件并复制配置内容到其中
     * 用于生产环境下非文件形式的资源配置处理
     * @param resource 资源对象
     * @throws IOException 如果文件操作失败
     */
    private void createTempFile(Resource resource) throws IOException {
        // 创建临时文件
        tempConfigFile = File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_SUFFIX);
        tempConfigFile.deleteOnExit();

        // 复制资源到临时文件
        try (InputStream is = resource.getInputStream();
             FileOutputStream fos = new FileOutputStream(tempConfigFile)) {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) > 0) {
                fos.write(buffer, 0, len);
            }
        }
    }

    /**
     * 清理资源,在 bean 销毁前执行
     * 删除创建的临时配置文件,防止残留
     */
    @PreDestroy
    public void destroy() {
        if (tempConfigFile != null && tempConfigFile.exists()) {
            boolean deleted = tempConfigFile.delete();
            log.info("临时配置文件{}删除{}", tempConfigFile.getAbsolutePath(), deleted ? "成功" : "失败");
        }
    }

    /**
     * 获取 Coze 平台的 OAuth JWT 令牌
     * 包括将 token 存储到会话以及构建响应模型等操作
     * @return 包含认证信息的模型对象
     */
    @Override
    public OAuthTokenModel getCozeOauthJwtToken() {
        OAuthToken tokenResp = getOAuthToken();

        // 获取当前会话并存储 token
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        HttpSession session = attr.getRequest().getSession();
        session.setAttribute(genTokenSessionKey(), tokenResp);

        String expiresInfo = String.format(D_S, tokenResp.getExpiresIn(), timestampToDateTime(tokenResp.getExpiresIn()));
        OAuthTokenModel oAuthTokenModel = new OAuthTokenModel
                (tokenResp.getAccessToken(), tokenResp.getRefreshToken()
                        , tokenResp.getTokenType(), expiresInfo);
        // 判断是否是 AJAX 请求
        if (XMLHTTP_REQUEST.equals(attr.getRequest().getHeader(X_REQUESTED_WITH))) {
            return oAuthTokenModel;
        }

        // 非 AJAX 请求也可以返回 model 或重定向等
        return oAuthTokenModel;
    }

    /**
     * 实际获取访问令牌的方法
     * 调用底层 SDK 获取新的令牌响应
     * @return 获取到的 OAuth 令牌响应对象
     */
    private OAuthToken getOAuthToken() {
        OAuthToken tokenResp = jwtoAuthClient.getAccessToken(UUID.randomUUID().toString());
        return tokenResp;
    }

    /**
     * 生成用于在会话中存储 token 的键名
     * @return token 的会话键名
     */
    private String genTokenSessionKey() {
        return AUTH_TOKEN;
    }

    /**
     * 将 Unix 时间戳转换为可读的日期时间字符串
     * @param timestampInSeconds 时间戳(秒)
     * @return ISO8601 格式的日期时间字符串
     */
    private String timestampToDateTime(long timestampInSeconds) {
        return Instant.ofEpochSecond(timestampInSeconds).toString();
    }

}

前端集成

前端VUE.js的示例代码

javascript 复制代码
      const cozeWebSDK = new CozeWebSDK.WebChatClient({


        config: {


          //修改为您的botId


          botId: import.meta.env.VITE_BOT_ID,


        },


        auth: {


          type: 'token',


          token: tokenValue,


          onRefreshToken: () => tokenValue


        },


        userInfo: {


          id: "12344",


          url: "//",


          nickname: "Guest",


        },


        ui:{


          base:{


            layout:"pc",


            lang:"zh-CN",


            zIndex:100


          }, 


          header:{


            isShow:false,


            isNeedClose:true,


          },


          asstBtn: {


            isNeed: true,


          },


          footer: {


            isShow: true,


            expressionText: 'Powered by Megadotnet',


            linkvars: {


              name: {


                text: 'A',


                link: 'https://www.test1.com'


              },


              name1: {


                text: 'B',


                link: 'https://www.test2.com'


              }


            }


          }


        },


        chatBot: {


          title: "Kids' Playmate | Snowy",


          uploadable: true,


          width: 800,


          el: undefined,


          onHide: () => {},


          onShow: () => {},


        },


      });


    });

官网webSDK
www.coze.cn/open/docs/d...

鉴权
www.coze.cn/open/docs/d...

会话隔离
www.coze.cn/open/docs/d...

结论

一、提升开发效率与灵活性
  1. 快速集成与部署

    • 扣子智能体WebSDK提供了丰富的API和组件,使得开发者能够快速将智能体功能集成到现有的Web应用或系统中,无需从零开始构建复杂的AI功能。
    • 通过简单的代码调用,即可实现智能体的部署和运行,大大缩短了开发周期。
  2. 灵活定制与扩展

    • SDK支持根据具体需求进行定制和扩展,开发者可以灵活调整智能体的功能、界面和交互方式,以适应不同的业务场景。
    • 这种灵活性使得扣子智能体能够广泛应用于各种领域,如客服、教育、娱乐等。
二、增强用户体验与互动性
  1. 智能交互与个性化服务

    • 通过集成扣子智能体WebSDK,Web应用或系统能够具备智能交互能力,为用户提供更加便捷、高效的服务。
    • 智能体可以根据用户的输入和需求,提供个性化的回答和建议,提升用户体验和满意度。
  2. 多模态交互支持

    • SDK支持语音、文本、图像等多种输入方式,使得用户可以通过多种渠道与智能体进行交互。
    • 这种多模态交互方式不仅丰富了用户体验,还提高了交互的便捷性和自然性。
三、促进业务创新与增长
  1. 拓展业务场景与应用范围

    • 扣子智能体WebSDK的集成实践使得企业能够轻松将AI技术应用于新的业务场景中,如智能客服、智能推荐、智能分析等。
    • 这些新的应用场景不仅拓展了企业的业务范围,还为企业带来了新的增长点。
  2. 提升业务效率与竞争力

    • 通过智能体的自动化处理和智能决策能力,企业可以显著提高业务处理效率和质量。
    • 同时,智能体还能够为企业提供数据分析和洞察支持,帮助企业更好地了解市场需求和用户行为,从而制定更加精准的市场策略。
四、推动AI技术的普及与应用
  1. 降低AI技术门槛

    • 扣子智能体WebSDK的集成实践降低了AI技术的应用门槛,使得更多的开发者和企业能够轻松接入和使用AI技术。
    • 这有助于推动AI技术的普及和应用,促进整个行业的创新和发展。
  2. 促进AI生态系统的建设

    • 通过提供开放、易用的SDK工具,扣子智能体促进了AI生态系统的建设和发展。
    • 更多的开发者和企业可以参与到AI技术的研发和应用中来,共同推动AI技术的进步和应用场景的拓展。
相关推荐
码以致用18 分钟前
用 DeepAgents 自动分析表格数据,一键生成图表与报告
人工智能·ai编程
PRINT!2 小时前
个人财富全景管理系统 AssetMe【内容均为AI制作】
spring boot·信息可视化·ai编程
peterfei2 小时前
我给 CLI 加了个「长期记忆」,1200 行代码让 AI 记住你的所有偏好
ai编程
Niubility2 小时前
AI 让一个人干一家公司?现实卡在 Vibe Coding 这一关
ai编程·claude·vibecoding
刀法如飞2 小时前
Rust数组去重的20种实现方式,AI时代用不同思路解决问题
人工智能·算法·ai编程
喜欢打篮球的普通人3 小时前
claude code 基础分享
ai编程
w1wi4 小时前
【Vibe Coding】TCP/UDP包篡改重放工具
人工智能·网络协议·tcp/ip·ai·udp·ai编程
程序新视界5 小时前
Claude Code的一次真实项目实践体验
ai编程·claude
sg_knight5 小时前
第一次用 OpenClaw,我让它 3 分钟写了个小工具
算法·llm·agent·ai编程·openclaw
甲维斯5 小时前
98%命中率!Claude+Opus4.7也太强了吧!
人工智能·ai编程