【发布时间】:2016-04-29 05:13:37
【问题描述】:
我正在设计一个 API,它允许用户进行身份验证(使用令牌)并包含同一域内的重定向。现在,对于返回 303 的端点的未经身份验证的请求,
GET /documents/123 --> 303 redirect to `/documents/abc`
GET /documents/abc --> 200
一切都很顺利。
让我们向发送Authorization 标头的同一端点发出经过身份验证的请求。这使得请求成为 preflighted request 并且浏览器执行预检 OPTIONS 请求,即
OPTIONS /documents/123 --> 204 (everything okay, please proceed)
GET /documents/123 --> 303 redirect to `/documents/abc`
此时,浏览器不会在/documents/abc 处找到实际资源,而不是GETting
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.
此行为符合the standard:
7.1.5 带预检的跨域请求
如果响应的 HTTP 状态码不在 2xx 范围内
应用网络错误步骤。
这似乎意味着一个不能对经过身份验证的资源进行重定向,即使重定向位于同一个域 (localhost)。
这真的是真的吗?有通用的解决方法吗?
【问题讨论】:
-
你的响应头是什么样的?尤其是 Access-Control-Allow-Headers?
-
对于预检
OPTIONS请求,我有Access-Control-Allow-Headers:Accept, Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, Accept-Encoding。 -
你的意思是这是重定向的 url /documents/abc 对吧?
-
嗯,他们反对任何会导致重定向的事情,因为这可能会导致安全问题。如果之前的请求被授权,您可以随时向客户端发出另一个请求。
-
后端当然可以不小心将客户端重定向到其他网站并包含令牌。我称之为(安全)错误,而不是标准需要规定的东西。重定向到另一个资源(即使它不是
Same-Origin)是一个完全有效的用例恕我直言。
标签: http redirect cors preflight