如何使用 RxDB 处理 JWT 身份验证?

Ala*_*jko 4 authentication couchdb jwt pouchdb rxdb

我有一个本地 RxDB 数据库,我想将它与 CouchDB 连接。除了身份验证之外,一切似乎都工作正常。我不知道如何以不同的方式添加它,然后在数据库网址中插入凭据:

database.tasks.sync({
        remote: `http://${username}:${pass}@127.0.0.1:5984/tododb`,
      });
Run Code Online (Sandbox Code Playgroud)

我想使用 JWT 身份验证,但找不到如何添加令牌来同步请求。我只找到了一些 PouchDB(pouchdb 身份验证插件)的解决方案,但无法使其与 RxDB 一起使用。

mic*_*nil 5

RxDB 与 PouchDB 紧密耦合,并在幕后使用其同步实现。据我了解,将自定义标头添加到远程 PouchDB 实例(这是当您将 url 作为参数传递时为您创建的remote)的唯一方法sync拦截 HTTP 请求

var db = new PouchDB('http://example.com/dbname', {
  fetch: function (url, opts) {
    opts.headers.set('X-Some-Special-Header', 'foo');
    return PouchDB.fetch(url, opts);
  }
});
Run Code Online (Sandbox Code Playgroud)

PouchDB 复制文档(同步)还指出:

RemoteDB 可以是字符串或 PouchDB 对象。如果您在远程数据库上进行了提取覆盖,您将需要使用 PouchDB 对象而不是字符串,以便使用这些选项。

幸运的是,RxDBRx.Collection.sync不仅接受服务器 url 作为remote参数,还接受另一个 RxCollection 或 PouchDB 实例。

RxDB 甚至重新导出内部使用的 PouchDB 模块,因此您不必将 PouchDB 安装为直接依赖项。

import { ..., PouchDB } from 'rxdb';

// ...


const remotePouch = new PouchDB('http://27.0.0.1:5984/tododb', {
  fetch: function (url, opts) {
    opts.headers.set('Authorization', `Bearer ${getYourJWTToken()}`)
    return PouchDB.fetch(url, opts);
  }
})

database.tasks.sync({
  remote: remotePouch,
});
Run Code Online (Sandbox Code Playgroud)