您可以配置小部件,以便在每次页面加载时使用新的Javascript API和JWT令牌对访问者进行身份验证。
本文适用于使用以下Chat版本的客户:
- 亚博Zendesk聊天阶段3(仅限聊天)
如果您正在使用以下任何版本,请参见在Web小部件中启用经过身份验证的访问者(经典版):
- 亚博Zendesk聊天阶段4(仅聊天或支持)
- 亚博Zendesk聊天阶段3(与Web小部件中的实时聊天(经典版))
有关识别您正在使用的Chat版本的帮助,请参见确定您的Zendesk聊天帐户版本亚博.
本文包括以下主题:
概述
当您将Chat小部件配置为使用经过身份验证的访问者时,您将获得以下好处:
能够有更高的信心和安全的访客/客户你或你的代理是真正的交易
支持跨域流量。如果你在多个域中嵌入小部件或链接到外部托管服务(例如Shopify),对访问者进行身份验证将使其成为跨域访问聊天平台的访问者,从而使你的代理有更多的上下文
支持跨设备/浏览器识别。如果在身份验证调用中指定了自定义ID,当访问者选择使用不同的设备或浏览器时,访问者可以被视为同一个人。
生成聊天共享秘密
要为访问者身份验证配置小部件,您需要一个共享密钥。共享密钥是一种安全设置,旨在一次性生成、复制和粘贴到与工程团队的通信中,或者直接粘贴到代码库中。它不应该在浏览器中输入。
只有Chat管理员可以配置访问者身份验证设置。
生成经过身份验证的访问者所需的共享密钥
- 打开你的聊天控制面板,转到设置>小部件.
- 单击小部件的安全选项卡。
- 向下滚动到Visitor Authentication部分,然后单击生成按钮。
重新生成新的共享密钥将撤销以前的令牌。如果您担心共享密钥已被泄露,则应该重新生成一个新密钥。如果您需要旋转密钥,您应该在Chat离线时安排它,因为重新生成密钥可能会导致访问者与小部件断开连接5分钟。
生成共享密钥后,使用它创建JWT令牌(了解更多关于JWT的信息),将其添加到Web Widget片段中。
创建JWT令牌
创建JWT令牌并将代码添加到Chat独立代码片段
- 为JWT令牌构造数据的服务器端有效负载。这需要有以下信息:
- 名字:客户名称
- 电子邮件:客户邮箱
- external_id:字母数字字符串,唯一标识客户。一旦为客户设置了该值,就不能更改。我们建议您在此字段中使用系统的唯一用户ID。例如user-123456。
- iat:当前时间戳的整数值,单位为秒。某些特定语言中的函数(例如JavaScript的Date.now())返回毫秒,因此请确保转换为秒。用于Chat身份验证的Iat允许最多两分钟的时钟偏差。
- 经验值:当前时间戳的整数值,单位为秒。该值指示JWT令牌何时到期。该值与iat值最大相差7分钟。
- 指定HS256作为JWT算法在你的JWT负载头:
{" type ":"JWT", "alg":"HS256"}
HS256代表HMAC SHA 256,是美国国家安全局设计的256位加密算法。
注意:亚博Zendesk不支持RS256和ES256 JWT算法。 - 使用代码示例下面是一个适合你语言需求的模板。
- 使用$zopim.livechat。验证Javascript API以提供一个函数,该函数在每次调用时提供一个新的JWT。下面是一个代码示例:
在上面的示例中,JWT_TOKEN_ENDPOINT是一个端点,可以在您自己的服务器上实现,以获取新的JWT。$zopim(function() {$zopim.livechat。authenticate({jwtFn: function(callback) {fetch('JWT_TOKEN_ENDPOINT').then(function(res) {res.text().then(function(jwt) {callback(jwt);});});} });});
注意:在整个聊天会话中可以多次调用jwtFn来获得一个新的JWT,以便在会话的整个生命周期内验证访问者的身份。 - 你可以使用$zopim.livechat.clearAll() API,当用户从主机应用程序/网站注销时,从小部件注销用户。
对于单页面应用程序,请注意,在使用$zopim.livechat.clearAll() API之后,不可能重新验证访问者。您需要重新加载页面才能再次对访问者进行身份验证。
代码示例
您的令牌需要在页面加载时从服务器端动态生成。找到下面符合你语言需求的模板。根据需要定制示例,确保用您自己的信息替换#{details}。
如果这些示例都不能满足您的需求,JWT有一个更广泛的列表JWT库去探索。
鲁比(人名)
首先,安装ruby-jwt.
如果你正在使用Rubygems:
Gem install JWT
如果你正在使用Bundler,在你的gem文件中添加以下代码:
宝石jwt的
接下来,使用共享密钥生成令牌:
require 'jwt' payload = {:name => "#{customerName}",:email => "#{customerEmail}",:iat =>时间戳,:external_id => "#{externalId}"} token = jwt。编码有效载荷,“#{yourSecret}”
NodeJS
安装jsonwebtoken:
NPM安装jsonwebtoken——save-dev
然后,使用共享密钥生成令牌:
Var JWT = require('jsonwebtoken');var payload = {name: '#{customerName}', email: '#{customerEmail}', iat: #{timestamp}, external_id: '#{externalId}'};Var token = jwt。号(有效载荷,# {yourSecret});
Python
安装python-jose:
PIP安装python-jose
使用共享密钥生成令牌:
from jose import jwt var payload = {'name': '#{customerName}', 'email': '#{customerEmail}', 'iat': #{timestamp}, 'external_id': '#{externalId}'} token = jwt。编码(有效载荷,# {yourSecret}
PHP
下载PHP-JWT:
Composer需要firebase/php-jwt
使用共享密钥生成令牌:
使用\重火力点\ JWT \ JWT;美元载荷={'名字' = > ' # {customerName} ', '邮件' = > ' # {customerEmail}’,‘iat = > #{时间戳},' external_id ' = > ' # {externalId}};$token = JWT::encode($payload, '#{yourSecret}');
长生不老药
添加' json_web_token_ex '到您的' mix '。练习的文件:
Defp deps do [{:json_web_token, "~> 0.2"}] end
使用共享密钥生成令牌:
data = %{name: "#{customerName}", email: "#{customerEmail}", iat: "#{timestamp}", external_id: "#{externalId}"} options = %{key: "#{yourSecret}"} jwt = JsonWebToken。签名数据、选项
关于经过身份验证的访问者的代理体验
当代理开始与经过身份验证的访问者聊天时,Chat仪表板中会更新一些内容。
首先,代理将能够通过覆盖在访问者头像上的绿色身份验证复选标记来告诉访问者是否经过身份验证:
代理还会注意到,它们不能编辑访问者的姓名或电子邮件,因为事实的来源来自通过Javascript API发送的信息。
最后,禁止一个经过认证的访问者将意味着访问者不能跨设备和浏览器访问聊天工具。
关于经过身份验证的访问者的小部件体验
通过身份验证的访问者在聊天小部件中的体验也会略有不同。首先,它们的信息是只读的,不能通过小部件或Javascript api进行修改。
其次,当访问者通过身份验证时,正在进行的聊天会话在设备之间同步。这让访问者可以灵活地切换电脑/浏览器,继续他们正在进行的聊天会话,例如,如果他们在桌面网络浏览器和移动网络浏览器上切换聊天小部件。
最后,对于经过身份验证的访问者,在弹出窗口中进行聊天的功能被删除,因为没有办法通过弹出窗口验证他们的身份(因为该体验托管在我们的域zopim.com上)。
2的评论
这遗漏了一个关键部分,即等待' $zopim '被定义的代码。我们在这一行得到' Uncaught ReferenceError: $zopim is not defined '。我不确定是否等待DOM内容被加载将是足够的,或者如果有其他的事情我们应该做,以确保zendesk js已经成功加载。亚博
我在过去工作过的脚本(例如,谷歌分析)让你把操作推到一个队列中,然后在加载库时工作。zendesk js有类似的功能吗?亚博
请登录留下评论。