如果您正在使用Web Widget (Classic)和您的Chat帐户,您可以配置您的小部件,以便在每次页面加载时使用Javascript API和JWT令牌对访问者进行身份验证。
本文适用于使用以下版本实时聊天的客户:
- 亚博Zendesk聊天阶段4 -仅聊天或支持)
- 亚博Zendesk聊天阶段3 -在Web小部件中集成聊天体验(经典版)
如果您正在使用Zendesk聊天阶亚博段3(仅聊天),请参见在Chat小部件中启用经过身份验证的访问者.
有关识别您正在使用的Chat版本的帮助,请参见确定您的Zendesk聊天帐户版本亚博.
本文包括以下主题:
概述
您可以配置小部件,以便在每次页面加载时使用新的Javascript API和JWT令牌对访问者进行身份验证。
当您将Web Widget (Classic)配置为使用经过身份验证的访问者时,您将获得以下好处:
- 能够有更高的信心和安全的访客/客户你或你的代理是真正的交易
- 支持跨域流量。如果你在多个域中嵌入小部件或链接到外部托管服务(例如Shopify),对访问者进行身份验证将使其成为跨域访问聊天平台的访问者,从而使你的代理有更多的上下文
- 支持跨设备/浏览器识别。如果在身份验证调用中指定了自定义ID,当访问者选择使用不同的设备或浏览器时,访问者可以被视为同一个人。
- 能够在小部件中向访问者展示过去的聊天对话
生成聊天共享秘密
生成共享密钥
- 从Chat仪表板转到设置>小部件>小部件安全选项卡.
- 单击生成按钮下的访问者身份验证部分:
因为这是一个安全设置,所以您的共享密钥将被生成、复制并粘贴到与您的工程团队的通信中,或者直接粘贴到您的代码库中。它不会被输入到浏览器中:
重新生成新的共享密钥将撤销以前的令牌。如果您担心共享密钥已被泄露,则应该重新生成一个新密钥。如果您需要旋转密钥,您应该在Chat离线时安排它,因为重新生成密钥可能会导致访问者与小部件断开连接5分钟。
生成共享密钥后,使用它创建JWT令牌(了解更多关于JWT的信息),将其添加到Web Widget片段中。
创建JWT令牌
创建JWT令牌并将代码添加到Chat独立代码片段
- 为JWT令牌构造数据的服务器端有效负载。这需要有以下信息:
- 名字:客户名称
- 电子邮件:客户邮箱
- external_id:字母数字字符串,唯一标识客户。一旦为客户设置了该值,就不能更改。我们建议您在此字段中使用系统的唯一用户ID。例如user-123456。
- iat:当前时间戳的整数值,单位为秒。某些特定语言中的函数(例如JavaScript的Date.now())返回毫秒,因此请确保转换为秒。用于Chat身份验证的Iat允许最多两分钟的时钟偏差。
- 经验值:当前时间戳的整数值,单位为秒。该值指示JWT令牌何时到期。该值与iat值最大相差7分钟。
- 使用下面的代码示例来找到适合您语言需求的模板。
- 使用带有' webWidget.authentication.chat '密钥的zessetting Javascript API。jwtFn '提供一个函数,该函数在每次调用JWT时提供一个新的JWT。下面是一个代码示例:
窗口。zessettings = {webWidget: {authenticate: {chat: {jwtFn: function(callback) {fetch('JWT_TOKEN_ENDPOINT').then(function(res) {res.text().then(function(jwt) {callback(jwt);});});}}}}};
注意:在整个聊天会话中可以多次调用jwtFn来获得一个新的JWT,以便在会话的整个生命周期内验证访问者的身份。
代码示例
您的令牌需要在页面加载时从服务器端动态生成。找到下面符合你语言需求的模板。根据需要定制示例,确保用您自己的信息替换#{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。签名数据、选项
签署了
如果要注销经过身份验证的访问者,请参阅Web Widget(经典)设置参考.
关于经过身份验证的访问者的代理体验
当代理开始与经过身份验证的访问者聊天时,Chat仪表板中会更新一些内容。
首先,代理将能够通过覆盖在访问者头像上的绿色身份验证复选标记来告诉访问者是否经过身份验证:
代理还会注意到,它们不能编辑访问者的姓名或电子邮件,因为事实的来源来自通过Javascript API发送的信息。
最后,禁止一个经过认证的访问者将意味着访问者不能跨设备和浏览器访问聊天工具。
关于为经过身份验证的访问者提供的Web Widget (Classic)体验
通过身份验证的访问者在聊天小部件中的体验也会略有不同。首先,它们的信息是只读的,不能通过小部件或Javascript api进行修改。
其次,当访问者通过身份验证时,正在进行的聊天会话在设备之间同步。这使访问者可以灵活地切换计算机/浏览器并继续他们正在进行的聊天会话,这在今天是不可能的。
第三,对于经过身份验证的访问者,在弹出窗口中进行聊天的功能被删除了,因为没有办法通过弹出窗口验证他们的身份(因为该体验托管在我们的域zopim.com上)。
最后,通过身份验证的访问者将能够通过在聊天日志中向上滚动来查看小部件中他们过去的对话。要了解对经过身份验证的访问者的对话历史记录支持,请单击在这里.
28日评论
你好,@……你能给我们提供一个完整的可下载的例子,这个主题与php。
请。
你好大卫,
您看到上面PHP部分中的下载链接了吗?PHP
你好,@…….
是的,我现在很困惑,我做了所有的步骤,但还是不行。所以请求下载,我想这对大家都有帮助。
@……下面是上面的链接:PHP-JWT
嗨白木Shokrizadeh谢谢你的指导。在实现所描述的更改之后,我们遇到了一些奇怪的行为。用户似乎通过了身份验证,并按照预期看到了其只读配置文件信息。然而,当点击“开始聊天”按钮时,显示以下错误信息:
在浏览器中没有可见的网络或控制台错误,并且当' webWidget.authentication.chat. net '中的逻辑。删除jwtFn '后,未经身份验证的聊天将按预期工作。任何关于如何解决这个问题的见解将非常感激!
编辑:
我见过这篇文章对这条错误信息和已确认的2个原因确定有不适用在这里。
安德鲁•里德感谢您让我们知道您所遇到的问题。你能不能联系我们的辩护团队提供小部件所在位置的链接,并对访问者进行身份验证,这样我们就可以看看您的实现情况如何?
谢谢白木Shokrizadeh!我们能够找出问题所在。如果对其他人有帮助,在添加身份验证逻辑时,我们忘记删除识别的命令.删除它之后,经过身份验证的用户可以毫无问题地开始聊天。
我想问一下如何不断调用jwtFn方法来更新令牌
这是我初始化它时添加的代码
我是一个单页应用程序,我如何通过登录后调用jwtFn方法来做到这一点。
感谢您联系Zendesk支持。亚博
关于您的问题,您是否能够检查上面提供的JTW令牌方法示例?在上面的示例中,为了多次调用jtwFn,您需要使用下面的行。
jwtFn:函数(回调){
fetch(“JWT_TOKEN_ENDPOINT”)(函数(res) {
res.text(),然后(函数(jwt) {
回调(jwt);
谢谢大家,祝你们度过美好的一天!
亲切的问候,
我在哪里可以找到一个javascript的例子来验证用户在聊天中我仍然在周围的答案,给我一个例子
嗨,Espartan Code,
你可以在下面的部分看到这篇文章的例子:
你好,
我们有一个JWT_TOKEN_ENDPOINT应该是什么样的例子吗?
我是后是否POST或GET ?
响应是什么样子的,例如JSON还是文本?什么内容类型?
谢谢你!
后Wedy Chainy问题:
嗨Wedy Chainy&Tim O’mahony,
这个文档实际上是为了传递给你团队的开发人员,因为这不是初学者文档,因为它需要编程技能。请放心,如果这是转发给开发人员,他们就有他们需要的一切。
但要澄清的是,即使我们“取回”,这仅仅意味着令牌可以由Javascript函数返回,也可以由外部页面返回,其代码逻辑写在文档中
Fetch的意思是,总是某种“GET”方法,但这里HTTP请求方法(GET、POST、PUT和DELETE)不相关,因为Fetch是JavaScript中的方法https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
这也与内容类型无关,因为我们期望JWT_TOKEN_ENDPOINT在调用它时返回令牌字符串。
JWT令牌字符串看起来像这样
例:
以下是我同事使用PHP和Firebase实现的2个截图
获取端点:
JWT生成:
希望这对你有帮助!
嗨!这很有帮助,谢谢。如果用户的external_id已经作为最终用户在Zendesk系统中,那么有两个问题:亚博
1.它会重新创建用户吗?(我猜不是)
2.这是否允许用户接收限定在用户标签和用户段范围内的文章?
谢谢!
嘿!
我们能用JWT把客户的电话号码发送给Zendesk吗?亚博
我们的员工使用Zendesk接听电话亚博,但通话记录与聊天记录是分开存储的,因为“聊天客户端”和“呼叫客户端”是两个不同的实体。
我们需要Zend亚博esk了解现在打电话的人和5分钟前聊天的人是同一个客户。
在这种情况下,我们认为通话记录和聊天记录将绑定到同一个实体,我们的员工将使用单一的通信记录。
根据文章解析JWT请求,是有可能通过的电话号码是JWT请求。您只需要确保电话号码是所描述的可接受的格式在这里.
如果您有任何困难,请随时与支持团队联系,我们将很乐意为您提供进一步的帮助。
最好的
嗨!
有以下错误
发送的JWT令牌看起来不错
不理解错误消息,看起来像一个问题,您应该已经有了您的bcs秘密令牌。你知道问题出在哪里吗?
谢谢你!
嘿,帕维尔,
请再次确认您是否使用的是聊天仪表板中的共享密钥,而不是Web Widget设置中的共享密钥?这是一个常见的问题,即使用的共享密钥不正确。
如果您确认正在使用聊天共享密钥,并尝试重新生成一个新密钥,但仍然不起作用,请通过消息传递或选项2与我们联系在这里所以我们可以进一步帮助你。
嗨!我在努力让这一切顺利进行。我可以看到聊天正在向我的端点发出一个请求,但没有发出另一个请求。在Agent视图中也没有用户详细信息或验证。算法需要是HS256吗?我在你的其他指南中找到了这些信息,但不是在这里,所以我有点困惑:https://support.亚博zendesk.com/hc/en-us/articles/4408836328346
有什么办法解决这个问题吗?也许解码/编码有一些问题?
编辑:在将算法更改为HS256后,我的问题得到了修复,添加了“type”:“JWT”标头并解析了“external_id”到字符串(我之前将其作为数字发送)。不确定这些变化中哪一个起了作用,因为我同时发布了这三个,但现在它可以工作了
您好,我看到当我们使用新的Messaging API对用户进行身份验证时,用户的external_id将显示在他们的配置文件上https://developer.亚博zendesk.com/documentation/zendesk-web-widget-sdks/sdks/web/enabling_auth_visitors/
但是,当我通过Classic SDK对用户进行身份验证时,虽然我们获得了用户的电子邮件和姓名,但却找不到我们提供的用于获取JWT令牌的external_id。是否有办法以某种方式获得外部ID ?
***急需帮助***
你好,试图在javascript上实现Zendesk小部件在我亚博的应用程序与身份验证。
返回JWT的API正在被正确调用,因为我可以从JS中看到。
返回的JWT如下:-
但是当小部件试图调用zendesk时,我一直在浏览器的网络选项卡上得到以下错误。亚博任何帮助都是感激的。
谢谢你的问题。
400个错误请求或未能验证索赔错误的问题似乎与您的值有关。
请确保您正在使用秒(不是毫秒)对于这两个iat和经验值。
iat和经验值:当前时间戳的整数值秒。
某些特定语言中的函数(例如JavaScript的Date.now())返回毫秒,因此请确保转换为秒。
希望能有所帮助
谢谢维克多Osetrov感谢您的及时回复。所以我使用JAVA rest API来生成JWT,我在下面使用以秒为单位生成时间。有什么想法吗,如果你还能想到什么问题呢?
还要补充的是,我尝试过使用和不使用base64编码的秘密,相同的错误消息。
我仍然没有包括“jti”作为索赔的一部分,因为我读了一些文件。
请建议。
谢谢你的快速回复。我仍然认为这个问题与价值观有关。
请您检查一下好吗?“名称”和“电子邮件”?
看起来你使用了两次相同的值:
希望能有所帮助,
嘿维克多Osetrov谢谢你回答我的问题。请参阅下面我更新的JWT有效载荷,我有不同的名字和电子邮件。只是重新迭代,我试过使用秘密作为Base64编码,没有它,继续得到
.
美好的一天,后面瞎跑Mukhrjee,
感谢您一直以来对这件事的耐心,希望您今天一切顺利!
为了回答这个问题,您不能使用不打算用于登录端点的属性,因为我们在后端有某种JWT的模型验证器。
因此,根据您的屏幕截图,属性不是所提供示例的一部分将使您的有效负载无效。
请记住,对于JS或任何编程语言,要尊重所提供的示例:
我个人将其用于PhP,以下是我如何构建有效负载:
而且它很有魔力!
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiUmVtaSBTYXVtZXQiLCJlbWFpbCI6InJzYXVtZXRfemVuZGVza0BvdXRsb29rLmNvbSIsImlhdCI6MTY2ODQyMjczMCwiZXh0ZXJuYWxfaWQiOiI4In0.4u9HZPEeVdA11_lIdYGdCvne0uTMGcDsvC_UnrpLXQQ
PS:记住external_id我属性:
希望这能澄清它!祝你今天过得愉快。
最好的问候,
你好,早上好。
我试图将所有信息发送到聊天,但它不起作用,我从另一台计算机访问内部网,历史显示为空,开始新的对话
代码如下:
服务器上的代码如下:
这应该使我们的客户在访问内部网时看到他的聊天记录,对吗?
请登录留下评论。