PouchDB认证触发CORS预检请求

8
以下代码(使用PouchDB认证插件)失败,因为它触发浏览器发送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 Node脚本启用了CORS。 我尝试过以下事情:
  • 在我的local.ini中,手动将OPTIONS添加为[cors]方法之一
  • { ajax: { content_type: "text/plain" } }作为第三个参数传递给login
因此,我的问题是:
  • 如何防止触发预检请求?查看MDN文档,似乎不必要。
  • 如果上述不可能,如何设置我的CouchDB服务器以响应预检请求?
2个回答

3
遇到了同样的问题。看起来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


谢谢您的建议。不幸的是,当我尝试按照您描述的指定源时,结果与之前相同(相同的错误,没有身份验证)。同时感谢提供链接,信息非常有用! - rvighne

0

使用最新的PouchDB进行身份验证的方法如下:

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

永远不要像这样进行身份验证 - 凭据是明文显示的。 - RamblinRose
有很多方法可以隐藏这个。 - Miko Chu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接