我在離子應用程式中使用 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(...)失敗。我已經通過開發人員工具的網路選項卡檢查了請求,我認為問題是在回應標頭中重新傳輸的 cookiethis.remote.logIn(...)未被后續呼叫使用(因此是未經授權的錯誤)。一旦在 Safari 上啟用了第三方 cookie,該問題就會得到解決,這在 iOS 上不是一個選項。
我該如何解決這個問題?
我正在考慮的一種潛在解決方案是覆寫fetch使用本機 http 客戶端(即HTTPfrom 的一個實體@ionic-native/http)。似乎可以修改 http 客戶端(例如,根據此對話),但我不確定如何實作。
uj5u.com熱心網友回復:
更改 HTTP 管道聽起來是一個非常糟糕的主意——主要是時間成本——除非你絕對必須使用會話/cookies……如果你不這樣做,請繼續閱讀。
正如此處關于 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);
我相信我選擇這種方法是因為我在這個答案的第一個鏈接中討論的身份驗證作業流程的性質。
uj5u.com熱心網友回復:
我同意@RamblinRose 在定義 PouchDB 物件時可能必須手動包含標題。
我自己在使用需要包含在標頭中以進行同步的 JWT 時找到了一個解決方案。
看到這個答案。注意:RxDB 在底層使用 PouchDB,所以它適用于這種情況。它幫助我同步,希望你也一樣!
https://stackoverflow.com/a/64503760/5012227
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/409834.html
標籤:
上一篇:在客戶端處理令牌認證
