Zendesk Chat配置JWT认证后客服端不显示用户名问题求助
Zendesk Chat 客服端不显示来访用户姓名排查方案
核心问题定位(90%集成踩中以下疏漏)
- 遗漏JWT必填字段:Zendesk Chat认证JWT的payload要求必须携带
scope: "user"字段,多数旧版官方示例未标注该字段,缺失后JWT会被静默判定为无效,访客自动以匿名身份接入,不会同步任何用户属性。 - 签名密钥不匹配:JWT签名使用的secret必须从Zendesk Chat后台「小组件-认证访客」配置页单独获取,不能使用Zendesk Support全局API密钥、其他产品线密钥,密钥错误时签名验证直接失败,前端无报错。
- 时间戳格式错误:
iat字段要求传10位秒级时间戳,如果直接传入Date.now()生成的13位毫秒级时间戳,JWT会被判定为过期/无效。 - 字段类型不符合要求:
external_id必须为字符串类型,不能传入数字值;email字段如果传入必须符合标准邮箱格式,否则属性同步会被拦截。 - 前端加载顺序错误:
window.zESettings配置必须在Zendesk Widget嵌入脚本加载前定义,如果先加载Widget脚本再赋值配置,认证逻辑完全不会生效,无任何报错。
对应修复方案
1. 修正JWT生成逻辑
正确的payload结构参考如下,确保所有模板占位符都被真实业务值替换,不要残留#{xxx}格式的模板字符串,生成后可直接解码JWT的payload段做校验:
var payload = { name: customerName, // 真实用户姓名字符串 email: customerEmail, // 合法邮箱格式 iat: Math.floor(Date.now() / 1000), // 转成10位秒级时间戳 external_id: String(externalId), // 强制转成字符串类型,确保用户唯一ID全局不重复 scope: "user" // 补全必填的scope字段 }; // 确认使用Chat后台单独生成的共享密钥做签名,签名算法固定用HS256,不要用RS256等其他算法 var token = jwt.sign(payload, chatAuthSecret, { algorithm: 'HS256' });
2. 修正前端配置逻辑
- 严格遵守「先定义配置,后加载Widget脚本」的顺序
- 检查JWT接口返回值:如果接口返回JSON结构(如
{token: "xxx"}),不要直接用res.text()取结果,要解析JSON后取token字段;如果返回纯文本JWT,要对结果做trim()处理,去掉多余的换行、空格、引号 - 跨域场景下给fetch添加
credentials: 'include'配置,确保接口能拿到当前登录态
正确的前端配置示例:
// 先定义配置 window.zESettings = { webWidget: { authenticate: { chat: { jwtFn: function(callback) { fetch('你的JWT接口地址', { credentials: 'include' }) .then(function(res) { // 如果接口返回JSON格式,用下面这行 // return res.json().then(data => data.token) // 如果接口返回纯文本JWT,用下面这行 return res.text().then(jwt => jwt.trim()) }) .then(function(jwt) { callback(jwt); }); } } } } }; // 后加载Widget脚本,不要把这段脚本放到配置定义前面 // <script id="ze-snippet" src="https://static.zdassets.com/ekr/snippet.js?key=你的Widget标识"></script>
3. 缓存问题处理
如果之前用匿名状态打开过Widget,浏览器会缓存匿名访客的localStorage和Cookie,就算后续JWT配置正确,也可能绑定到旧的匿名访客ID上导致属性不更新。测试时请用浏览器无痕模式,或清除站点下Zendesk相关的所有存储后再重试。
4. 客服端校验
- 确认使用的是Zendesk Chat工作台查看会话,不是Support工单界面
- 认证用户的属性会在用户第一次发送消息时同步到坐席端,用户未发消息前不会主动拉取用户信息展示
内容的提问来源于stack exchange,提问作者alia
相关产品推荐
相关产品推荐

