单点登录身份验证的核心是一种称为 JSON 网络密钥 (JWT) 的技术,它使 Zendesk 可以信任从您的系统获得的登录请求。有关详情,请参阅设置使用 JWT(JSON 网络密钥)的单点登录
JSON 网络密钥身份验证请求如下所示:
https://joeandco.zendesk.com/access/jwt?jwt=eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpYXQiOjEzNzIxMTMzMDUsImp0aSI6ODg4MzM2MjUzMTE5Ni4zMjYsIm5hbWUiOiJUZXN0IFVzZXIiLCJlbWFpbCI6InR1c2VyQGV4YW1wbGUub3JnIiwiZXh0ZXJuYWxfaWQiOiI1Njc4Iiwib3JnYW5pemF0aW9uIjoiQXBwbGUiLCJ0YWdzIjoidmlwX3VzZXIiLCJyZW1vdGVfcGhvdG9fdXJsIjoiaHR0cDovL21pdC56ZW5mcy5jb20vMjA2LzIwMTEvMDUvQmFybmFieV9NYXR0X2Nyb3BwZWQuanBnIiwibG9jYWxlX2lkIjoiOCJ9.Zv9P7PNIcgHfxZaMwQtMpty3TZnmVHRWcsmAMM-mNHg
在浏览器的 URL 栏中输入此内容后,我就登录了 Zendesk 实例。
就这么简单。无需其它。 没有服务器在看不见的地方互相交谈。 这一切都发生在一个 URL 中。
一个远程身份验证脚本只需构建它(嗯,类似的)并将用户指向那里。
让我们分解密钥。
https://joeandco.zendesk.com/access/jwt?jwt=
第一位是远程身份验证请求应定向到的 URL 端点。后面跟一个问号 (?),表示您正在添加参数。参数将一些信息传递到目标端点 (https://joeandco.zendesk.com/access/jwt) 的脚本。脚本必须设计为接受这些参数,这就是为什么您需要将其发送到 /access/jwt 而不仅仅是某个随机地址。
问号后的“jwt”是参数名称,“=”表示后面的字符串是参数的值。
剩下的就是数据了。如果您仔细观察,您会发现它按句点(句号)分成多个组块。我们将依次查看每个组块。
块 1:JWT 标头
第一个块是 JWT 标头。它表示这是一个 JWT 请求,并表示使用的哈希算法的类型。(稍后会详细介绍。)
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
对此(以及其余数据)的重大启示是它是 base64 编码的。这实际上不是加密,因此可以通过以下工具轻松解码:
- 网络工具:://www.base64decode.org/ http://www.base64decode.org/
- 终端:://www.opinionatedgeek.com/dotnet/tools/base64decode/ http://drewsymo.com/how-to/quick-and-simple-base64-encode-on-mac-osx-terminal/
这是该字符串已解码的样子:
{"typ":"JWT",
"alg":"HS256"}
您可以看到它采用 JSON 结构,并有两个键值对,有效地表示 type: JWT
和 Algorithm: HMAC SHA 256
。SHA 256 是由美国设计的 256 位加密算法 设计的一种 256 位加密算法。它用于生成第三个块——签名——我们稍后会讲到。
块 2:JWT 声明集/有效负载
第二个块要长得多,因为它包含有效负载。它称为“JWT 声明集”。
eyJpYXQiOjEzNzIxMTMzMDUsImp0aSI6ODg4MzM2MjUzMTE5Ni4zMjYsIm5hbWUiOiJUZXN0IFVzZXIiLCJlbWFpbCI6InR1c2VyQGV4YW1wbGUub3JnIiwiZXh0ZXJuYWxfaWQiOiI1Njc4Iiwib3JnYW5pemF0aW9uIjoiQXBwbGUiLCJ0YWdzIjoidmlwX3VzZXIiLCJyZW1vdGVfcGhvdG9fdXJsIjoiaHR0cDovL21pdC56ZW5mcy5jb20vMjA2LzIwMTEvMDUvQmFybmFieV9NYXR0X2Nyb3BwZWQuanBnIiwibG9jYWxlX2lkIjoiOCJ9
其中包含时间戳、随机值、用户名、电邮地址、外部 ID 和一些标签。还有更多可用选项。同样,只需对其进行 base64 解码,以了解有效载荷。我将把这些行分开,以便于理解。
{
"iat":1372113305,
"jti":8883362531196.326,
"name":"Test User",
"email":"tuser@example.org",
"external_id":"5678",
"organization":"Apple",
"tags":"vip_user",
"remote_photo_url":"http://mit.zenfs.com/206/2011/05/Barnaby_Matt_cropped.jpg",
"locale_id":"8"
}
是否必要
IAT
第一个密钥是iat,代表颁发于。这是一个时间戳,格式为自 1970 年 1 月 1 日以来的整秒,这是时间的标准 UNIX 表示。时间戳必须是整数(没有小数),并且必须采用 UTC。此外,它必须在 Zendesk 服务器接收到的当前时间的 3 分钟内。这将在每个远程身份验证请求中设置自毁机制,防止任何单个请求在生成后超过 3 分钟被使用。
JTI
第二个键jti代表JSON 密钥 ID。这实际上只是一个随机字符串。它必须足够长且随机,使其不太可能再次用于此帐户。如果意外或偶然将其重新用于另一个身份验证请求,则该请求将失败。这相当于一个一次性的密钥。通过包含这样的(强制)随机值,我们可确保没有两个身份验证请求完全相同。这可防止重复使用有效的请求 URL。例如,假设某人已成功在您的计算机或网络上安装恶意软件,并已开始记录您的流量。他们可以看到您点击的每个 URL。如果他们看到并抓取了您被分配用于登录 Zendesk 的 URL,他们可以在 3 分钟内使用该 URL 以您的身份登录,而无需使用此一次性密钥。
姓名
接下来是用户的全名,包括空格。无论 Zendesk 在这里收到什么,都将被设置为用户名,即使他们以前设置了不同的名称。
电邮
之后是用户的电邮。这将用作用户的唯一标识符,除非收到外部 ID*。这意味着如果我们收到一封电邮和一个外部 ID,我们会先尝试匹配该 ID。 如果这样做,我们将使用指定的电邮地址更新该用户。
*注意: 如果在 Zendesk 中启用了“允许更新外部 ID”选项,我们将继续关闭电邮,即使收到了外部 ID。如果电邮和外部 ID 不同,我们将更改 ID。
可选
外部 ID
外部 ID 是一个可选的 ID,可用于识别用户,而不是使用其电邮地址(如上所述)。
组织
您还可以传递一个组织值,以便将用户添加到一个组织。命名组织必须已经存在,且名称必须完全匹配。否则不进行任何操作。
工单标签
tags键允许您设置标签 在登录的用户上。密钥会用您指定的工单标签替换用户的任何现有工单标签,因此请谨慎使用。传递空白的 tags 参数将移除用户的所有工 单标签。
远程照片 URL
您也可以传递一个值 remote_photo_url,它接受一个包含照片的公开 URL,并将此照片设置为用户的个人资料照片。
区域设置(语言)
您可以传递一个locale_id 的值,以便在 Zendesk 中设置或更新已通过身份验证的用户的语言。该值必须是一个匹配您 Zendesk 中当前激活的区域设置的数字。您可以使用我们 API 的 locales.json 端点查找区域设置:https ://developer.zendesk.com/api-reference/ticketing/account-configuration/locales/#list-locales
用户字段(示例中未显示)
这必须是一个 JSON 对象,其中包含每个字段键和值的键值对。字段密钥可在“用户字段”界面中找到或定义。请注意,仅可传递自定义用户字段。
例如:
"user_fields": {"checked": false,"date_joined": "2013-08-14T00:00:00+00:00","region": "EMEA","text_field": null}
复选框使用布尔值,日期代码如上例所示,下拉菜单接受选项名称。文本字段接受字符串。
电话号码(示例中未显示)
这接受一个字符串作为电话号码身份。确保以可接受的格式指定电话号码。有关更多信息,请参阅可接受的电话号码格式有哪些?
组块 3:JWS 签名
请求的最后一个块是已加密的部分。您无需太担心,但基本上它会获取上述所有信息(iat、jti、姓名、电邮等)以及共享密钥,并从中生成一个加密字符串。然后,根据 JWT 标准,提取该加密字符串的一部分(称为 校验和),这就是 JWS 签名。
那么这如何安全?
要生成有效的加密字符串,您必须知道共享密钥。
加密的设计使您无法从加密的字符串回溯到数据和密钥。即使您有数据内容,也几乎不可能推断出密钥。
但由于您有密钥,我们也有密钥,而且您发送给我们的数据未加密与加密数据相同,因此我们可以自己建立签名,并检查它是否与您发送的内容匹配。
它还确保没有人可以篡改传输中的数据。
这是您用伪代码构建它的方式:
URLBase64Encode(
HMAC-SHA256(
URLBase64Encode( header_json ).URLBase64Encode( payload_json )
)
)
当生成已编码标头和有效负载的 HMAC-SHA256 时,您将包含共享密钥。
结果如下:
Zv9P7PNIcgHfxZaMwQtMpty3TZnmVHRWcsmAMM-mNHg
翻译免责声明:本文章使用自动翻译软件翻译,以便您了解基本内容。 我们已采取合理措施提供准确翻译,但不保证翻译准确性
如对翻译准确性有任何疑问,请以文章的英语版本为准。