我有一个节点应用程序,它在客户端上使用CouchDB作为数据库和PouchDB。要登录,请求将一个请求发送到节点服务器,该服务器使用CouchDB实例对用户的凭据进行身份验证,然后再将cookie发送回客户端。问题是,在重新启动浏览器并登录后,当Pouch尝试连接到数据库时,CouchDB会发送401 Unauthorized响应,并且浏览器会显示其默认登录弹出窗口。即使AuthSession cookie在浏览器中,也会发生这种情况。
Chrome中的完整错误是:Failed to load resource: the server responded with a status of 401 (Unauthorized) http://localhost:5984/user/?_nonce=rItPZR1fgbHrwn0a
在Chrome弹出框中输入用户凭据并刷新页面后,它会正常加载。转到列出的页面并输入用户凭据会提供有关用户的各种元数据。
我假设发生了这种情况,因为PouchDB实际上并不使用节点服务器发送的AuthSession令牌,而是在用户提示401后由CouchDB提供给它的cookie。有没有办法解决这个问题?
提前致谢。
实际上,只要在客户端上设置了cookie,PouchDB就会自动获取身份验证。我有一个插件来演示这个:https://github.com/nolanlawson/pouchdb-authentication。您可以使用此插件直接与您的CouchDB对话,它肯定会有效。也许你的Node代理没有在PouchDB和CouchDB之间传递cookie?
您可能需要拦截和修改PouchDB的fetch
调用以添加credentials
选项,您可以在第一次构造数据库对象时轻松执行此操作:
db = new PouchDB('https://yourcouch/yourdb', {
fetch: (url, opts) => fetch(url, { ...opts, credentials: 'include' /* OR 'same-origin' */ })
});
请注意,您需要在适当的位置将其设置为same-origin
,或者将include
设置为交叉原点/无原始请求。