成功的预检,但取消了授权标题的回复

问题描述 投票:0回答:2

我正在研究与快速服务器通信的Ionic应用程序。事情一直很好,直到最后一个发布周期。部署后,我们的一半API调用在我们的实时服务器上停止正常运行。

我已经将问题缩小到包含Authorization标头的请求。所有其他不需要Auth标头的请求工作正常,但具有auth的那些请求在prefilght选项检查上返回204,但随后实际请求被取消。控制台在Firefox上提供0 - {"isTrusted":true},在Chrome上提供net::ERR_CONNECTION_CLOSED。实际的请求甚至没有达到我能告诉的服务器,响应只是一个状态代码为0的空响应对象。

所以我不知道从哪里开始,我一直在阅读有关CORS问题但我们最近没有更改任何标题或配置。

另外,令人抓狂的是我们在iPhone 5上的测试版本运行良好,但在桌面版网络浏览器和Android上,它失败了。可能是Safari Mobile的旧版本?

以下是使用auth标头失败的示例GET请求。

PREFLIGHT REQUEST:
Host: app.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Access-Control-Request-Method: GET
Access-Control-Request-Headers: app-api-key,authorization
Origin: http://localhost:8100
Connection: keep-alive

PREFLIGHT RESPONSE:
server: nginx/1.10.3 (Ubuntu)
date: Sat, 03 Mar 2018 06:14:39 GMT
x-dns-prefetch-control: off
x-download-options: noopen
x-xss-protection: 1; mode=block
access-control-allow-origin: http://localhost:8100
vary: Origin, Access-Control-Request-Headers
access-control-allow-credentials: true
access-control-allow-methods: GET,HEAD,PUT,PATCH,POST,DELETE
access-control-allow-headers: app-api-key,authorization
x-frame-options: SAMEORIGIN, SAMEORIGIN
x-content-type-options: nosniff, nosniff
X-Firefox-Spdy: h2

GET REQUEST HEADERS:
Accept  application/json, text/plain, */*
Accept-Encoding gzip, deflate, br
Accept-Language en-US,en;q=0.5
app-api-key: fakeapikeyhere
Authorization: JWT fakejwtauthtokenhere
Connection: keep-alive
Host: app.example.com
Origin: http://localhost:8100
Referer: http://localhost:8100/?ionicpl…tp://localhost:8100/ionic-lab
User-Agent: Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/58.0
express cors http-headers authorization http2
2个回答
2
投票

HTTP / 2对HTTP标头非常严格,并且在这些标记格式不正确时不允许请求。所以这里可能还存在一个问题,但HTTP / 1.1只是对它有点宽容。

This post通过在Chrome中使用chrome:// net-internals /#events页面然后查看HTTP2_SESSION,提供了有关如何调试任何HTTP Header问题的详细信息。虽然这更倾向于错误接收标头,但您的问题似乎是发送最后一个请求。

肯定似乎有你的标题有些东西:

x-frame-options: SAMEORIGIN, SAMEORIGIN
x-content-type-options: nosniff, nosniff

为什么重复这些值?

GET REQUEST HEADERS:
Accept  application/json, text/plain, */*
Accept-Encoding gzip, deflate, br
Accept-Language en-US,en;q=0.5

为什么这些值在标题名称后没有冒号?

不确定这些都是拼写错误或复制/粘贴错误,但他们现在看起来有点怀疑。

此外,在HTTP / 2下,所有标题名称应为小写,但大多数浏览器会自动为您转换。标题值可以是大写,小写或混合大小写。

希望这能让你进一步深入研究。


0
投票

所以我有一半解决了这个问题。这最终实际上是某种HTTP / 2.0问题。我认为最近我的Digital Ocean服务器重启时,有些东西已经更新或启用了。某些不支持HTTP / 2.0的浏览器正在运行而其他浏览器则不支持。我不完全确定为什么我的调用不适用于HTTP / 2.0,但这是一个单独的问题。

如果您正在调试这是否是您的问题,您可以尝试运行chrome并禁用http2并查看它是否开始工作。从chrome目录运行:

./chrome.exe --disable-http2

通过从我的NGINX配置中删除http2来解决我的具体情况。

运行:

sudo nano /etc/nginx/sites-available/default

并编辑以下内容:

# SSL Config
listen 443 ssl http2 default_server; # <- Removed the http2
listen [::]:443 ssl http2 default_server; # <- Removed the http2

然后重新启动它

sudo systemctl restart nginx
© www.soinside.com 2019 - 2024. All rights reserved.