来自 jQuery.ajax 请求的 403 Forbidden 响应与 PhoneGap 桌面

Posted

技术标签:

【中文标题】来自 jQuery.ajax 请求的 403 Forbidden 响应与 PhoneGap 桌面【英文标题】:403 Forbidden response from jQuery.ajax request with PhoneGap Desktop 【发布时间】:2016-02-22 22:41:29 【问题描述】:

我设置了一个 PhoneGap 项目并通过 PhoneGap 桌面启动它。 在这个项目中,我调用了以下 jQuery 方法:

$.ajax(
        type: 'GET',
        url: 'http://api.fixer.io/latest',
        dataType: 'json',
        success: function(data)
            exchangeRates = data;
            displayData(exchangeRates);
        
    )

一旦我使用按钮触发它,我会收到 403“禁止”响应。 请求的网址是:http://192.168.178.40:3000/proxy/http://api.fixer.io/latest

这是PhoneGap Desktop加载应用程序和代理的本地Serveradress(192.168.178.40:3000),这似乎也来自PhoneGap。 发送的请求头是这样的:

Host: 192.168.178.40:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.178.40:3000/
Cookie: connect.sid=s%3AhoA3oe0JbAdmGQ4Z6bYlRuFa.oDM1qjeHCadzwfSmYy%2BFabG0b22OH0ZqRgVuLMlcCL8
Connection: keep-alive

响应头如下:

Connection: close
Content-Type: text/plain
Date: Fri, 20 Nov 2015 12:07:23 GMT
Server: nginx/1.4.6 (Ubuntu)
Status: 403 Forbidden
Transfer-Encoding: chunked

当我尝试打开请求的 URL 时,它会提供我想要的 JSON。

为什么我会得到 403?有人可以帮忙吗?

[成功后编辑] 好吧,好像我在我设置的 PhoneGap 项目中遇到了问题,因为 Simon Pricketts 的建议似乎是正确的。 所以我建立了一个全新的项目。这次是没有 PhoneGap 覆盖的直接 Cordova 5.4.0 项目。然后我再次尝试了 Simons 的建议,瞧 ---> 这次成功了!

结论:PhoneGap 项目的 config.xml 与 Content-Security-Policy 结合导致 App 出现故障,导致 403 错误。由于我对 PhoneGap 不太熟悉,所以我尝试了直接使用 Cordova,效果很好。

【问题讨论】:

它提供了我想要的 JSON,但是如果你看到控制台,你可以找到实际的问题。一种解决方案是使用填充手段 jsonp 响应 json 以进行跨域数据共享。 【参考方案1】:

如果使用 Cordova 5,您可能需要设置 Content Security Policy 元标记,如果使用 ios9 或将来将应用程序迁移到 iOS 时,还需要另外配置 App Transport Security。

我有一篇博客文章演示了如何执行此操作,并且实际上还使用了您尝试使用的相同数据源 - 您可以阅读此 here。

如果这是您的问题,您的 index.html 中需要这样的内容:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src http://api.fixer.io">

注意:connect-src 子句指定访问http://api.fixer.io

【讨论】:

除了 &lt;access origin="*"/&gt; 或项目 config.xml 中的类似内容外,还需要此文件 这似乎是一个不错的选择。我尝试了(明确的)白名单建议,但这似乎不是漏洞答案。现在我看看你的回答是否对我有帮助。到目前为止,谢谢。【参考方案2】:

您很可能没有whitelisted 您尝试访问的域。如this question 中所述,在连接到“外部”域之前,您需要将其列入白名单。

只是为了让我们在这里也有答案:您需要将其添加到您的配置文件中:

<access origin="*" />

【讨论】:

其实我的 config.xml 中已经有了这个。还是不行。我会尝试明确的白名单。 感谢您的建议,到目前为止没有帮助。【参考方案3】:

在 Post Cordova 5 中,我认为您需要将白名单作为插件包含在 config.xml 文件中,如下所示:

<access origin="http://*.phonegap.com" subdomains="true" />
<access origin="*://*.api.fixer.io/*" subdomains="true" />

<plugin name="cordova-plugin-whitelist" />

如果您想从外部源或 ajax 调用将外部文件包含到窗口中,您需要以这种方式包含插件

【讨论】:

以上是关于来自 jQuery.ajax 请求的 403 Forbidden 响应与 PhoneGap 桌面的主要内容,如果未能解决你的问题,请参考以下文章

axios post请求和JQuery $ .ajax请求都是在移动设备上返回403禁止错误

Django jquery ajax 返回403

如何在 Firefox 中解码来自 jQuery $.ajax 请求的 XML 响应

来自本地文件系统的 jQuery Ajax 请求(Windows 文件:///)

LARAVEL - JQuery AJAX 403 禁止

将 jquery ajax POST 请求更改为 fetch api POST