CORS与预检要求和重定向:不允许。 解决方法? CORS与预检要求和重定向:不允许。 解决方

2019-05-11 16:07发布

我设计的API,允许用户(使用令牌)进行身份验证,并包含相同网域内的重定向。 现在,对于未经身份验证的请求到返回303端点,

GET /documents/123  --> 303 redirect to `/documents/abc`
GET /documents/abc  --> 200

一切都工作地非常好。

让我们做一个认证请求,在同一端点Authorization头中发送。 这使得请求预检请求 ,并且浏览器预检OPTIONS请求,即

OPTIONS /documents/123   --> 204 (everything okay, please proceed)
GET /documents/123       --> 303 redirect to `/documents/abc`

在这一点上,而不是GET婷的实际资源在/documents/abc ,浏览器产量

XMLHttpRequest cannot load http://localhost:8000/people/username/nschloe. 
The request was redirected to 'http://localhost:8000/people/YDHa-B2FhMie', 
which is disallowed for cross-origin requests that require preflight.

此行为是符合标准 :

7.1.5跨来源请求与预检

如果该响应具有HTTP状态代码不在2XX范围

应用网络错误的步骤。

这似乎意味着,一个人不能做重定向的认证资源,即使重定向是在同一个域( localhost )。

这能是真的吗? 是否有一个共同的解决方法吗?

Answer 1:

最初的标准不排除成功CORS预检后重定向。 引用§7.1.5.3 :

这是实际的请求。 应用提出要求的步骤和观察之下,而发出请求的请求规则。

  • 如果响应具有301,302,303,307,或308的HTTP状态代码应用缓存和网络错误的步骤。

由于你的努力(谢谢!),8月4日的标准进行更新 ,使成功的CORS飞行前检查后重定向。

直到浏览器赶上,唯一可行的选择似乎是一个或组合:

  1. 问题只对重定向简单的请求 。
  2. 发出305重定向 ,用在您自己的网址Location标题为“代理”。 对于有限的浏览器支持准备,因为305已经过时了。
  3. 做一个假的“重定向”:
    • 用返回HTML meta refresh和/或Javascript Location变化。
    • 返回具有视填充HTML iframe与重定向目标为iframe的来源。
    • 显示该用户以访问内容点击一个链接。


文章来源: CORS request with Preflight and redirect: disallowed. Workarounds?