简介
本文档对跨源资源共享进行了全面介绍,以便在进行故障排除时,能够全面了解底层进程。
先决条件
要求
Cisco 建议您了解以下主题:
- Cisco Unified Contact Center Enterprise(UCCE)版本12.6.X
- 思科套装联络中心企业版(PCCE)版本12.6.X
- 思科Finesse版本12.6.X
- 思科统一情报中心(CUIC)版本12.6.X
使用的组件
本文档中的信息基于以下软件和硬件版本:
- UCCE版本12.6.2
- Finesse版本12.6.2
- CUIC版本12.6.2
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
背景信息
什么是CORS
跨源资源共享(CORS)是服务器控制允许哪些网站(域、协议和端口)访问其资源的方法。虽然浏览器通常阻止来自不同来源(相同来源策略)的请求,但CORS使服务器能够选择性地放宽此限制。实质上,服务器使用特殊的HTTP报头来告诉浏览器允许哪些来源、允许哪些类型的请求(如GET、POST等),以及可以包含哪些自定义报头。这样,服务器就可以决定谁可以访问其API以及如何访问,范围从完全开放到严格限制。CORS的工作方式是让浏览器和服务器通过这些HTTP报头进行通信来管理跨源请求。
CORS使用HTTP报头启用受控跨源请求。浏览器和服务器通过这些报头进行通信,服务器指定允许的来源、方法和报头。如果服务器的响应报头缺失或无效,浏览器将阻止响应,实施相同来源策略。对于某些请求,浏览器首先向服务器发送印前检查请求,以确保它接受实际的跨源请求。
浏览器使用印前检查请求来检查服务器是否允许跨源请求,然后再发送实际请求。这些印前检查请求包括HTTP方法和自定义报头等详细信息。然后,启用CORS的服务器可以响应,允许或拒绝实际请求。如果未为CORS配置服务器,则服务器无法正确响应印前检查,并且浏览器会阻止实际请求,从而保护服务器免受不必要的跨源访问。
跨源资源共享(CORS)对Web安全和功能至关重要。它允许对不同来源(域、协议、端口)的资源进行受控访问,这是必要的,因为浏览器会实施通常阻止此类访问的相同来源策略。
CORS的生命周期
CORS请求包括两个方面:发出请求的客户端和接收请求的服务器。在客户端,开发人员编写JavaScript代码以将请求发送到服务器。服务器通过设置特定于CORS的报头来响应请求,以指示允许跨源请求。没有客户端和服务器的参与,CORS请求将失败。
CORS请求中的关键参与者是客户端、浏览器和服务器。客户端需要来自服务器的某些数据,例如JSON API响应或网页内容。浏览器充当受信任的中介,用于验证客户端是否可以从服务器访问数据。
客户端:
客户端是在网站上运行的JavaScript代码片段,它负责发起CORS请求
注意:Finesse是一种Web应用程序。它安装在服务器上,代理只需使用其Web浏览器对其进行访问,无需在客户端安装或维护插件或其他软件。正如CORS In Action with Cisco Finesse示例所示,此架构支持实时数据报告等功能。在这种情况下,Cisco Finesse live数据小工具的JavaScript代码充当客户端,而Cisco CUIC则充当CORS生命周期内的服务器。基本上,基于浏览器的Finesse客户端与CUIC服务器交互以检索实时数据。
客户端与用户:
有时,客户端和用户这两个词可以互换使用,但在CORS环境中它们有所不同。用户是访问网站的人或在此上下文中访问Finesse的Finesse用户(座席或主管),而客户端是该网站提供的实际代码。多个用户可以访问同一网站,并可使用同一JavaScript客户端代码。
浏览器:
浏览器也称为用户代理,承载客户端代码。它通过向传出请求添加额外信息,使服务器能够识别客户端,从而在CORS中起到关键作用。此外,浏览器解释服务器的响应,确定是将数据传送到客户端还是返回错误。这些浏览器端操作对于维护相同来源策略提供的安全至关重要。如果浏览器不执行CORS规则,客户端可能会发出未经授权的请求,从而破坏这种重要的安全机制。
服务器:
服务器是CORS请求的目标,它是Cisco Finesse的CUIC for Live data小工具示例。服务器存储客户端想要的数据,并且它对是否允许CORS请求具有最终决定权。
现在您已经知道谁参与了CORS请求,让我们看一看他们如何协同工作。后续图像说明高级CORS生命周期:
1.客户端发起请求。
2.浏览器向请求添加其他信息并将其转发到服务器。
3.服务器决定如何响应请求,并将响应发送到浏览器。
4.浏览器确定客户端是否必须有权访问响应,并将响应传递给客户端或返回错误。

在发送跨源请求之前,浏览器会自动向HTTP请求添加源报头。客户端无法修改的报头是CORS的重要组成部分,用于标识客户端的来源(即加载客户端资源的域、协议和端口)。 此安全措施可防止客户端模拟其他源。源报头是CORS的基础,因为它是客户端向服务器告知源头的方法。
在跨源资源共享(CORS)交互中,客户端的源由初始请求中的源头标识。然后,服务器在其响应中使用Access-Control-Allow-Origin报头来指示是否允许客户端访问请求的资源。此响应报头至关重要;如果没有,则CORS请求失败。Access-Control-Allow-Origin报头可以包含通配符(*)(允许来自任何来源的访问),也可以包含特定来源(仅授予该特定客户端的访问权限)。当图像显示Access-Control-Allow-Origin时:*暗示CUIC允许所有来源,CUIC通常在真实场景中发送带有特定来源的此报头。

当浏览器拒绝CORS请求时,意味着客户端不会收到有关服务器响应的信息。客户端只知道发生了错误,但缺少有关特定问题的详细信息。由于很难将CORS故障与其他类型的错误区分开来,因此调试这些CORS错误可能会带来挑战。即使向服务器发送初始请求,如果服务器的响应缺少有效的Access-Control-Allow-Origin报头,浏览器也会阻止响应并在客户端触发错误,使客户端无法看到服务器的详细响应。

此图说明了整个CORS流程,尤其侧重于飞行前阶段,该阶段对于处理特定类型的跨源请求至关重要。

CORS与Cisco Finesse配合使用
示例:使用实时数据小工具分析CORS行为
本节介绍在联系中心使用Cisco Finesse进行跨来源资源共享(CORS)的典型情况。座席和主管通常使用Cisco Finesse访问实时数据报告(如示例图所示)。
当座席或主管点击报告小工具时,其操作会启动数据检索请求。此请求使用GET方法从Finesse应用程序的JavaScript代码(充当客户端)发送到CUIC/Live数据服务器。如SAML Tracer图像所示,浏览器首先向服务器发送印前检查请求,即前面所述的CORS生命周期。

HTTP OPTIONS请求(印前检查请求)将发送到CUIC/实时数据服务器。此请求将源指定为Finesse服务器的完全限定域名(FQDN),包括端口8445。这是座席用于访问Cisco Finesse应用的地址和端口。

CUIC/Live Data服务器上的命令行界面(CLI)命令控制允许哪些源访问其实时数据资源。如果在这些设置中配置了Finesse服务器的源(其FQDN和端口),则代理可以在Finesse中查看实时数据小工具详细信息。


用于CORS连接测试的TAC工具
服务器端CORS配置错误有时会导致Cisco Finesse中的第三方或实时数据小工具出现问题。这篇文章提供了一个指向CORS快速检查小工具的链接,故障排除工具旨在帮助诊断影响Finesse小工具的跨源资源共享问题,包括实时数据显示和其他第三方集成。
从技术上讲,此小工具的工作方式是从Cisco Finesse客户端向指定的目标资源发送印前检查请求。此快速检查功能有助于快速确定和解决与CORS相关的问题,从而加快故障排除过程。
要在Finesse桌面中部署Contact Center CORS Quick Check 12.6-v1.0小工具,请执行以下操作:
1.从Contact Center CORS Quick Check 12.6-v1.0 folder.2下载小工具的文件。
2.将Contact Center CORS Quick Check 12.6-v1.0文件夹的内容复制到Finesse安装中的3rdpartygadget目录中。
3.在Finesse桌面布局中将小工具添加到所需的用户角色(座席、主管等)。提供的示例XML演示了添加此小工具的正确配置。
<gadget>/3rdpartygadget/files/TestCORSgadget.xml</gadget>
有关上传第三方小工具并将其添加到桌面的详细信息,请参阅Finesse开发人员指南中的第三方小工具一章和Finesse管理指南中的管理第三方小工具一章。
上传小工具文件并重新启动Cisco Finesse Tomcat服务后,小工具即可使用并显示图形用户界面(GUI)。

您可以从顶部的下拉列表中选择CUIC。在提供的字段中输入CUIC服务器的完全限定域名(FQDN)。一个成功的测试将如下所示。

成功的测试意味着CUIC服务器已正确配置为与Finesse服务器进行跨源资源共享(CORS)。浏览器的SAML Tracer日志显示HTTP选项请求(CORS预检)已发送到CUIC服务器。此请求在Origin报头中包含Finesse服务器的地址。CUIC服务器以200 OK HTTP消息进行响应,重要的是,响应中的Access-Control-Allow-Origin报头也包含Finesse服务器的地址。这确认已将CUIC服务器配置为允许来自Finesse服务器源的请求,从而验证CORS是否已正确设置。
OPTIONS https://cuicpub.uccelab.tac/cuic/ HTTP/1.1
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome..
sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"
sec-ch-ua-mobile: ?0
Accept: */*
Origin: https://finessep.uccelab.tac:8445
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://finessep.uccelab.tac:8445/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: en-US,en;q=0.9
HTTP/1.1 200
server: nginx
date: Sat, 08 Feb 2025 01:27:47 GMT
content-length: 0
strict-transport-security: max-age=31536000; includeSubDomains
set-cookie: JSESSIONID=bE73993C4A7C1Fc1b33A7AaF897B8428; Path=/cuic; Secure; HttpOnly; SameSite=Strict
pragma: No-cache
cache-control: no-cache
expires: Thu, 01 Jan 1970 00:00:00 GMT
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
content-security-policy: default-src 'self' ; script-src 'self' data: 'unsafe-inline' 'unsafe-eval' ; style-src 'self' data: 'unsafe-inline' blob: ; img-src 'self' data: 'unsafe-inline' ; connect-src 'self' https://cuicpub.uccelab.tac:443 wss://cuicpub.uccelab.tac:443 https://cuicsub.uccelab.tac:443 wss://cuicsub.uccelab.tac:443 ;
vary: origin,access-control-request-method,Access-Control-Request-Headers
access-control-allow-origin: https://finessep.uccelab.tac:8445
access-control-allow-credentials: true
access-control-expose-headers: access-control-allow-origin,access-control-allow-credentials,access-control-max-age,access-control-allow-headers,access-control-allow-methods,access-control-allow-private-network
access-control-max-age: 600
access-control-allow-methods: DELETE,POST,GET,OPTIONS,PUT
access-control-allow-headers: referer,peripheralid,origin,access-control-request-method,locale,accept,authorization,domain,x-requested-with,access-control-request-headers,content-type,access-control-request-private-network,user-agent
allow: GET,POST,OPTIONS,PUT,DELETE
在此场景中,该工具演示了非工作配置。与上一个示例不同,Finesse服务器未配置为CUIC服务器上的用户。相反,它仅在CUIC发布服务器上配置。因此,CORS预检请求失败,CUIC服务器以HTTP 403(Forbidden)错误做出响应。

OPTIONS https://cuicsub.uccelab.tac/cuic/ HTTP/1.1
Accept: */*
Access-Control-Request-Method: OPTIONS
Origin: https://finessep.uccelab.tac:8445
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome..
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
Sec-Fetch-Dest: empty
Referer: https://finessep.uccelab.tac:8445/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: en-US,en;q=0.9
HTTP/1.1 403
server: nginx
date: Sat, 08 Feb 2025 01:54:52 GMT
content-type: text/html;charset=utf-8
content-length: 2143
strict-transport-security: max-age=31536000; includeSubDomains
set-cookie: JSESSIONID=1C7606841B83d7847486c3d18D31cEfD; Path=/cuic; Secure; HttpOnly; SameSite=Strict
pragma: No-cache
cache-control: no-cache
expires: Thu, 01 Jan 1970 00:00:00 GMT
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
从CUIC用户命令行界面(CLI)的输出中可以看到,Cisco Finesse未列出。这表示Finesse当前未配置为此CUIC服务器上的用户。
admin:utils cuic cors allowed_origin list
cors_allowedorigins
===========================
1. https://finessep.uccelab.tac
2. https://finesses.uccelab.tac
3. https://finesses.uccelab.tac:8445