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

时间:2016-08-09 20:32:53

标签: javascript cors couchdb pouchdb preflight

以下代码(使用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服务器以响应预检请求?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用最新的PouchDB进行身份验证,如下所示:

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