【问题标题】:How to handle JWT authentication with RxDB?如何使用 RxDB 处理 JWT 身份验证?
【发布时间】:2020-09-19 14:27:23
【问题描述】:

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

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

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

【问题讨论】:

  • 一个相当广泛的问题。我一直在 HTTPS 上使用标头身份验证(即基本),这对于我的情况来说足够安全。你读过CouchDB's Authentication docs吗?
  • 是的,我读过它,但我的意思是 - 不知道如何向 RxDB 请求标头添加任何内容。对于基本身份验证(我的问题示例),它会自动转换并添加,但我如何添加到此标头 cookie 或 JWT 令牌?

标签: authentication couchdb pouchdb jwt-auth rxdb


【解决方案1】:

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

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);
  }
});

PouchDB replication documentation (sync) 还声明:

remoteDB 可以是字符串或 PouchDB 对象。如果您在远程数据库上有一个 fetch 覆盖,您将希望使用 PouchDB 对象而不是字符串,以便使用这些选项。

幸运的是,RxDB 的 Rx.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,
});

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 2017-05-29
    • 2014-07-24
    • 2019-06-09
    • 2019-08-31
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2015-06-09
    相关资源
    最近更新 更多