跨源资源共享 (CORS)
启用跨域资源共享 (CORS) 对于从一个域或网站向部署在其他服务器上的 ThingWorx 应用程序发出请求至关重要。
|
|
CORS 与 HTTP 直接相关,因为它使用 HTTP 标头来确定跨域请求是否安全以及是否允许。有关详情,请参阅 HTTP 开发人员指南。
|
1. 更新位于 <Apache Tomcat Install>\webapps\Thingworx\WEB-INF\ 中的 web.xml 文件,方法是将以下 CorsFilter 和 CorsFilter Mapping 作为第一个参数放置在 </session-config> 行之后:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>[ALLOWED_ORIGINS]</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>OPTIONS,GET,POST,HEAD,PUT,DELETE</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Authorization,appKey,x-thingworx-session,Content-Type,X-Requested-With,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Accept</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>10</param-value>
</init-param>
<init-param>
<param-name>cors.request.decorate</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
|
|
请知悉下列事项:
• 将 cors.allowed.origins 参数更新为所需的网址。
• 如需指定多个允许的源,可使用逗号分隔符。例如,https://origin1.com, https://origin2.com。
• * 可以专门用于允许来自所有源的请求。* 只能单独使用,以允许所有源。* 不能用作 URI 的一部分。
• 对于针对 PingFederate 使用单点登录 (SSO) 的环境,请确保将 PingFederate 运行时服务器 FQDN 添加为允许的源。
◦ http://<Ping Federate FQDN>:9301 http://<Ping Federate FQDN>:9031
• 根据需要在 cors.allowed.headers 参数中添加或移除任何自定义标头。
• 将 cors.support.credentials 设置为 true 以允许进行基本身份验证。
|
2. 在 web.xml 文件中注释掉下面与 OPTIONS 相关的块。
<!-- <security-constraint>
<web-resource-collection>
<web-resource-name>Forbidden</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>OPTIONS</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint> -->
3. 保存 web.xml 文件。
4. 重新启动 Apache Tomcat。
其他详情
每次升级 ThingWorx 后,需要重新启用 CORS,因为在此过程中会移除
<Tomcat Home>\webapps\Thingworx 文件夹。有关详情,请参阅适用于您的 Tomcat 版本的
官方 Apache Tomcat 配置参考。
可使用在线 Javascript 编辑器并执行以下脚本之一对 CORS 进行测试。
• 应用程序密钥身份验证
<script>
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://[THINGWORX_HOST]:[PORT]/Thingworx/Things", true);
xhr.setRequestHeader("appKey", "<APPLICATION_KEY>");
xhr.setRequestHeader("accept", "application/json");
xhr.send();
</script>
|
|
必须使用 ThingWorx Platform 中启用的未到期应用程序密钥替换 <APPLCATION_KEY>。
|
• 用户名和密码身份验证
<script>
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://[THINGWORX_HOST]:[PORT]/Thingworx/Things", true);
xhr.setRequestHeader("Authorization", "Basic <USER_PASSWORD>");
xhr.setRequestHeader("accept", "application/json");
xhr.send();
</script>
|
|
<USER_PASSWORD> 必须是 Base64 编码,用户名和密码之间用冒号分隔。例如,用户名 Administrator 及其密码 ptc123 将以 Administrator:ptc123 格式输入到 Base64 编码器中,得到的值为 QWRtaW5pc3RyYXRvcjpwdGMxMjM=。此方法仅用于测试目的,因为可以对 Base64 进行解码以获取纯文本形式的用户名和密码值。
|
建议在两个安全的服务器之间进行资源共享。例如,两者均启用 HTTPS。仅在连接的一端启用 HTTPS 可能会导致混合内容错误。