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。我尝试过的事情:
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 请求进行身份验证