PouchDB 身份验证触发 CORS 预检请求

Posted

技术标签:

【中文标题】PouchDB 身份验证触发 CORS 预检请求【英文标题】:PouchDB authentication triggering CORS preflight request 【发布时间】:2016-12-16 00:58:38 【问题描述】:

以下代码(使用 PouchDB Authentication 插件)失败,因为它触发浏览器发送 CORS 预检请求,并且 CouchDB 不支持 OPTIONS HTTP 方法。

var db = new PouchDB("http://localhost:5984/mydb");
db.login('username', 'password');
// assume the database URL and login info are valid

这是错误(在 Chrome 中)。请注意,Edge 中也会出现此问题,但 Firefox 中不会:

XMLHttpRequest 无法加载 http://localhost:5984/_session。预检响应包含无效的 HTTP 状态代码 405

以下是 Chrome 为请求发送的标头(它们在 Firefox 中没有显着差异):

POST /_session HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 25
Accept: application/json
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:8080/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,es-419;q=0.6,es;q=0.4

我已经通过 add-cors-to-couchdb 节点脚本启用了 CORS。我尝试过的事情:

在我的 local.ini 中手动将 OPTIONS 添加为 [cors] 下的方法 将 ajax: content_type: "text/plain" 作为第三个参数传递给login

所以,我的问题是:

如何防止触发预检请求?看MDN documentation,好像没必要。 如果以前的方法不可行,如何设置我的 CouchDB 服务器以响应预检请求?

【问题讨论】:

【参考方案1】:

使用最新的 PouchDB,您可以像这样进行身份验证:

var remote = new PouchDB("http://user:password@localhost:4984/bucket/");

【讨论】:

永远不要像这样进行身份验证 - 凭据在普通站点中。 有很多方法可以隐藏这个。【参考方案2】:

遇到同样的问题。似乎 Chrome 最近开始在发送 OPTIONS 预检方面更加积极。 部分解决方法是在 CORS 标头中指定特定来源而不是“*”, 所以

curl -X PUT $HOST/_config/cors/origins -d '"localhost:8080"'

或类似的。

我仍然收到预检错误,但现在 PouchDB 已成功验证,所以我可以忽略该错误。 我认为解决方法是让 CouchDB 响应 _session url 上的 OPTIONS。

编辑,更多信息在这里 https://github.com/nolanlawson/pouchdb-authentication/issues/111

【讨论】:

感谢您的建议。不幸的是,当我尝试按照您的描述指定来源时,结果与以前相同(相同的错误,没有身份验证)。也感谢您的链接,这些信息非常有帮助!

以上是关于PouchDB 身份验证触发 CORS 预检请求的主要内容,如果未能解决你的问题,请参考以下文章

为啥经过身份验证的 CORS 请求的预检 OPTIONS 请求在 Chrome 中有效,但在 Firefox 中无效?

CORS 预检请求返回带有 Windows 身份验证的 HTTP 401

预检请求没问题,然后,经过身份验证,响应不包含允许 cors 标头

将 Spring Security(双向 SSL)配置为仅对 CORS 预检 OPTIONS 请求进行身份验证

对 Kong api 网关端点的基本身份验证请求出现 CORS 错误并且未找到预检

使用 Windows 身份验证启用 CORS ASP.NET Web API 2 应用程序中的预检请求