gpt4 book ai didi

authentication - 如何更改 pouchDB 使用的 http 客户端?

转载 作者:行者123 更新时间:2023-12-05 02:34:59 29 4
gpt4 key购买 nike

我在 ionic 应用程序中使用 PouchDB 和 CouchDB。虽然我可以在 Chrome 和 Android 上成功同步本地和远程数据库,但在运行同步命令时,我在 Safari/iOS 上遇到未经授权的错误。下面是我的数据库服务提供商的简化版本。

import PouchDB from 'pouchdb';
import PouchDBAuthentication from 'pouchdb-authentication';

@Injectable()
export class CouchDbServiceProvider {
private db: any;
private remote: any;
constructor() {
PouchDB.plugin(PouchDBAuthentication);
this.db = new PouchDB('localdb', {skip_setup: true});
}
...
login(credentials) {
let couchDBurl = 'URL of my couchDB database';
this.remote = new PouchDB(couchDBurl);
this.remote.logIn(credentials.username, credentials.password, function (err, response) {
if (err) { concole.log('login error') }
else {
let options = { live: true, retry: true, continuous: true };
this.db.sync(this.remote, options).on('error', (err_) => { console.log('sync error')});
}
})
}
...
}

在上面的代码中,this.remote.logIn(...) 成功但 this.db.sync(...) 失败。我已经通过开发人员工具的网络选项卡检查了请求,我认为问题是 this.remote.logIn(...) 的响应 header 中重新生成的 cookie 未被使用随后的调用(因此是未经授权的错误)。一旦在 Safari 上启用了第三方 cookie,这个问题就得到了解决,这在 iOS 上不是一个选项。

我该如何解决这个问题?

我正在考虑的一个潜在解决方案是重写 fetch 以使用 native http 客户端(即来自 @ionic-native/http< 的 HTTP 实例)。似乎可以修改 http 客户端(例如,根据此 conversation ),但我不确定如何实现。

最佳答案

更改 HTTP 管道听起来像是一个非常糟糕的主意 - 主要是时间成本 - 除非你绝对必须使用 session /cookie...如果你不这样做,请继续阅读。

作为noted here关于 pouchDB 安全性,我尝试使用 pouchdb-authentication当它积极维护并由于多个问题而走另一条路时(我不记得具体情况,那是 6 年前)。

请注意,上一次提交 pouchdb-authentication 似乎是 3 年前。尽管从表面上看,不活动并不是一个负面指标——一个项目可能只是得出了一个可靠的结论——安装 pouchdb-authentication 会产生这个

found 6 vulnerabilities (2 moderate, 3 high, 1 critical)

再加上过去几年人们对插件缺乏热爱,这导致为新项目增加危险的技术债务。

如果可能,只需使用 auth 发送凭证创建(或打开)远程数据库时的选项,例如

const credentials = { username: 'foo', passwd: 'bar' };
this.remote = new PouchDB(couchDBurl, { auth: credentials });

我不记得为什么,但我编写的代码本质上是下面的内容,并且重复使用它是因为它只适用于 fetch。选项

const user = { name: 'foo', pass: 'bar' };
const options = { fetch: function (url, opts) {
opts.headers.set('Authorization', 'Basic ' + window.btoa(user.name+':'+user.pass));
return PouchDB.fetch(url, opts);
}
};

this.remote = new PouchDB(couchDBurl, options);

我相信我之所以选择这种方法,是因为在本答案的第一个链接中讨论了我的身份验证工作流的性质。

关于authentication - 如何更改 pouchDB 使用的 http 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70658479/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com