- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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 客户端(例如,根据此 conversation ),但我不确定如何实现。HTTP
实例
最佳答案
更改 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/
在 Pouchdb 中,处理多个数据集合的最佳方式是什么?我的意思是,例如,我需要多个待办事项列表,而不是一个简单的待办事项列表,例如:家庭待办事项、工作待办事项、社区待办事项和生态待办事项。 我应该
https://pouchdb.com/guides/compact-and-destroy.html 中的 PouchDB 文档引起了我的注意。 : By default, PouchDB and
PouchDB最佳实践建议是使用 PUT而不是 POST用于创建新文档(类似于 rdbms 中的一行),主要是因为后者会生成一个随机 ID,这使得后续数据排序效率低下。 PUT另一方面,需要提供用户生
我来自 Mysql 背景,现在正在使用 Pouchdb。我习惯了每个应用程序有 1 个数据库和许多表的 SQL 模式。 在 pouchDB 中则不同,因为数据不是存储在表中而是存储在文档中。因此,在我
我不知道在哪里可以捕获在 pouch 中访问远程 couchdb 的失败尝试。例如: var testPouchDB = new PouchDB('http://remotedb-url/non-ex
我在 pouchdb 中有一些数据,我想显示 pouchdb 中的总行数,我该怎么做? angular.module("pouchapp", ["ui.router"]) .run(function(
在浏览器中处理与同一远程/本地数据库同时同步的多个 PouchDB 实例的推荐方法是什么? 我的设置是浏览器中的一个 Web 应用程序,它与远程 CouchDB 持续同步。 该 Web 应用程序可以多
有没有办法更新文档的id?我试图通过以下代码实现这一点,但这会引发错误(如下): this.db.get('oldId') .then(document => { this.logshee
我正在使用 PouchDB 和 node.js 将我的文档存储在服务器上,但在开发过程中,许多有缺陷或需要删除的文档已经开始在数据库中积累。 是否有像 SQL Studio 这样的 GUI 客户端,它
我使用 CouchDB 作为后端,使用 PouchDB 在 vuejs 应用程序中查询/同步数据库。 我有 4 种不同类型的文档都存储在一个数据库中,如上所示: { "_id": "patient
CouchDB 文档: "members": [ { "name": "Mark", "age": 35, }, { "name": "
我在使用 pouchdb-find 创建索引以在 pouchDB 中搜索时遇到了一些麻烦.我一直收到错误 找不到可用的索引。尝试在以下位置创建索引:dateCreated。确保只有 $eq、$gt、$
我正在尝试将我的 redux 状态同步到 PouchDB 实例,但遇到了问题。 正如日志中所示,在操作发生后,我的 redux 状态既没有同步到 PouchDB,PouchDB 文档也没有在更新时同步
首先,我对使用 cloudant 还很陌生,所以这对我来说是一个非常陡峭的学习曲线。任何帮助表示赞赏。到目前为止我能找到的所有信息都来自几年前看似过时的 SO 帖子。 我已经设置了一项在我的资源列表中
首先,我对使用 cloudant 还很陌生,所以这对我来说是一个非常陡峭的学习曲线。任何帮助表示赞赏。到目前为止我能找到的所有信息都来自几年前看似过时的 SO 帖子。 我已经设置了一项在我的资源列表中
我正在使用 Angular5 项目测试 PouchDB。我想使用这些 pouchdb 插件: pouchdb-find relational-pouch 所以我知道如何导入 PouchDB: impo
我是 pouchdb 和 nw.js 的新手,可能这个问题有点太简单了(抱歉我的无知)。 我试图通过 require() 在 nw.js 项目中使用 pouchdb,但没有成功。 根据 pouchdb
在 PouchDB 中设置了一个continuous(实时)复制之后,我如何找到这些(比如 _replicate 或 _replicator 的事件任务)在 CouchDB 中)? 或者更确切地说,我
我在应用程序启动时建立同步(与事件监听器),我需要停止它并再次运行。有一个 .cancel() 函数可以工作,但我如何才能重新启动同步? 我试图删除在 cancel() 之后从 sync() 函数返回
假设我们将以JSON对象表示的汽车(约40MB)存储在PouchDB中,并且我们想基于马力属性进行搜索。 sql中的示例:从HP> 100的汽车中选择*。 您可以按键查询pouchDB,但是显然HP并
我是一名优秀的程序员,十分优秀!