从 Zendesk(javascript) 连接到 Acumatica(IIS)

Posted

技术标签:

【中文标题】从 Zendesk(javascript) 连接到 Acumatica(IIS)【英文标题】:Connect from Zendesk(javascript) to Acumatica(IIS) 【发布时间】:2018-03-03 22:02:05 【问题描述】:

我正在尝试使用以下代码从 javascript 连接到 Acumatica:

var xmlhttp = new XMLHttpRequest();
URL = "h ttps://demo.mytestwebsite.com/entity/auth/login/";
xmlhttp.open("POST", URL, false);
xmlhttp.setRequestHeader("Authorization", "Basic " + btoa("Admin:hgfjk"));
xmlhttp.send();

得到错误:

VM2372:7 选项 https://demo.mytestwebsite.com/entity/auth/login/ 405(不允许的方法) 连接@VM2372:7 (匿名)@ VM2374:1 VM2372:7 XMLHttpRequest 无法加载 http://demo.mytestwebsite.com/entity/auth/login/。预检响应具有无效的 HTTP 状态代码 405 连接@VM2372:7 (匿名)@ VM2374:1 VM2372:7 未捕获的 DOMException:无法在“XMLHttpRequest”上执行“发送”:无法加载“http s://demo.mytestwebsite.com/entity/auth/login/”。 连接时 (:7:15) 在:1:1

【问题讨论】:

连接到此端点时,您不应使用基本授权。 I210 课程提供了一些示例。 【参考方案1】:

尝试使用用户名、密码、公司、分支机构和语言环境(公司、分支机构和语言环境是可选的)作为请求正文,而不是使用基本身份验证,如下例所示:

URL = "http://10.211.55.3/***/entity/auth/login";  //Your URL
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", URL, false);
xmlhttp.setRequestHeader("Content-Type", "application/json");
var params = " name: '<username>', password: '<password>' ";
xmlhttp.send(params);

【讨论】:

我试过了:connect = function() var xmlhttp = new XMLHttpRequest(); URL = "demo.mytestwebsite.com/entity/auth/login"; xmlhttp.open("POST", URL, false); xmlhttp.setRequestHeader("Content-Type", "application/json"); var params = ' "name":"Admin","password":"lpoio","company":"Demo88","branch":"ZZ"'; xmlhttp.send(参数); 但得到以下错误: XMLHttpRequest 无法加载 demo.mytestwebsite.com/entity/auth/login。对预检请求的响应未通过访问控制检查:“Access-Control-Allow-Origin”标头包含多个值“*,hhhhhh.zendesk.com”,但只允许一个。因此,Origin 'hhhhhhh.zendesk.com' 不允许访问。连接@ VM2468:8(匿名)@ VM2470:1 VM2468:8未捕获的DOMException:无法在“XMLHttpRequest”上执行“发送”:无法加载“mytestwebsite.com/entity/auth/login”。在连接时 (:8:15) 在 :1:1 “Access-Control-Allow-Origin”标头包含多个值的问题之前已在 ***.com/questions/22343384/… 中讨论过【参考方案2】:

此问题是由 CORS 引起的,即 Web 浏览器没有从托管 Acumatica 的 IIS 获得必要的响应来满足 CORS。 CORS 是一种提高浏览器安全性的机制。

遇到此问题时,您还可能遇到以下错误:

预检响应包含无效的 HTTP 状态代码 500 对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头

从 Acumatica 版本 6.10.0945 开始,这是您配置 IIS 以使其 CORS 与 Acumatica 兼容以满足此类要求的方式。

在 IIS 中添加以下 HTTP 响应标头。

名称: Access-Control-Allow-Origin 值: http://5.5.5.5(将连接到 Acumatica 的站点的 IP 地址或 URL - 例如。https://mycompany.zendesk.com)李> 名称: Access-Control-Allow-Headers 值: Content-Type、缓存控制 名称: Access-Control-Allow-Credentials 值: true

从 Internet 信息服务 (IIS) 管理器添加值时,它们也会作为自定义标题出现在 Acumatica 应用程序文件夹中的 web.config 文件中。例如 - C:\Program Files (x86)\Acumatica ERP\MainAcumatica\web.config

我在将条目直接添加到 web.config 时遇到了问题,因此建议通过 IIS 完成。

其次,需要在与 web.config 位于同一目录的 Global.asax 文件中创建一个条目

这是完整的文件,其中插入的函数是 Application_BeginRequest()

    <%@ Application Language="C#" Inherits="PX.Web.PXApplication" %>
<script RunAt="server">
    protected override void MergeAdditionalAssemblyResources()
    
        PX.Web.UI.AssemblyResourceProvider.MergeAssemblyResourcesIntoWebsite<PX.Web.Controls.PXResPanelEditor>();
    

    protected override void Initialization_ProcessApplication()
    
        Initialization.ProcessApplication();
    

protected void Application_BeginRequest() 
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS") 
        Response.Flush();
    

</script>

此文件中的函数 Application_BeginRequest() 正在刷新应用程序为 CORS OPTIONS 请求生成的响应,并让 IIS 使用其标头配置来处理它。

OPTIONS 请求由 Web 浏览器中的 CORS 机制发出,称为“预检”,以确认请求的目标服务器符合 CORS。

这些设置将解决报告的问题。

【讨论】:

以上是关于从 Zendesk(javascript) 连接到 Acumatica(IIS)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Javascript 连接到 XMPP 服务器

如何使用自签名证书从 Javascript 连接到 SSL 服务器?

我可以从浏览器中运行的 JavaScript 直接连接到 Redis 服务器吗?

使用 Javascript 连接到 XMPP 服务器

使用 javascript 和 php 连接到 phpmyadmin 上的数据库

我是否可以通过socket.io和JavaScript将Unity程序连接到node.js服务器,如果可以,怎么办?