【问题标题】:Writing document to CouchDB using angular $http with authentication使用带有身份验证的角度 $http 将文档写入 CouchDB
【发布时间】:2015-07-23 18:05:27
【问题描述】:

我在移动应用程序中使用 PouchDB 将本地数据库实例与远程数据库实例同步。我需要将_security 文档添加到数据库中。我尝试将 _security 添加到本地 PouchDB 数据库,但它不允许添加/编辑以 _ (设计文档)开头的文档。因为本地数据库中不需要_security 文档,所以我想我可以通过发送 HTTP PUT 请求将其添加到远程数据库中。

使用 cUrl 我可以使用以下命令添加 _security 文档:

curl -X PUT http://dbadmin:'password'@IP.ADDR:5984/databasename/_security -d '{"admins":{"names":["myuser"], "roles":[]}, "readers":{"names":[],"roles":["myreaders"]}}'

而且效果很好。我的 Angular $http 方法有问题。我使用此代码:

$http({
      method: 'PUT',
      url: "http://dbadmin:password@IP.ADDR:5984/databasename/_security",
      data: JSON.stringify({_id: '_security', admins: {names: ['"' + userID + '"'], roles: []}, readers: {names: [], roles: ['"myreaders"']}})
  });

我收到此错误:Error: Access to restricted URI denied

我做错了什么?我该如何解决这个问题?

也欢迎任何其他关于如何编写security 文档的建议,即不使用 $http。我查看了:https://github.com/pouchdb/pouchdb/issues/3529 及其链接的页面,但找不到适合我的解决方案。我查看了pouchdb-security 插件,但我希望不必使用插件来编写_security 文档,并且在插件的项目页面(https://www.npmjs.com/package/pouchdb-security)上也找不到有关该插件的任何文档。

【问题讨论】:

    标签: angularjs curl couchdb pouchdb


    【解决方案1】:

    这可能不是您想听到的答案,但如果您正在 PUT 来自客户的 _security 文档,那么您可能做错了什么。授予所有用户对 CouchDB 的完全管理员权限是灾难的根源。

    这就是为什么 PouchDB 不能让您轻松 PUT _security 文档。 :)

    至于“访问受限URI”错误本身,可能是因为你没有在CouchDB上启用CORS:https://github.com/pouchdb/add-cors-to-couchdb

    【讨论】:

    • 我不认为我做错了什么。如果您查看我发布的 github 链接,就会有关于此的讨论。 PouchDB 开发人员正在参与该讨论,但没有人提到,放置/添加 _security 文档有问题。我不给用户完全的管理员权限,你为什么认为我这样做?我以管理员身份登录为用户创建数据库(使用 pouchdb-authentication [你写的吗?)。我也不认为这是一个 CORS 问题,因为我安装了 CORS CouchDB 插件,如果我禁用安全(管理员)数据库同步工作。
    • 对不起,我重新阅读了 Github 问题,是的,我写了 pouchdb-authentication。那个问题的讨论是为什么 PouchDB 本身不允许你放置 _security 文档,开发人员的讨论是我们是否应该公开一个通用的 AJAX 包装器 (db.request),实际上我们现在这样做了,尽管我们称之为它extras/api。不过,一般来说,您可以使用任何 AJAX 方法(例如 $http)来完成您想要的。我仍然不推荐它,因为是的,您需要管理员权限才能 PUT _security 文档。
    【解决方案2】:

    我现在可以尝试,但我认为您的问题来自您随请求发送的 _id 数据:

    _id: '_security'
    

    文档的 ID 已经在 URL ("http://dbadmin:password@IP.ADDR:5984/databasename/_security",) 上,所以你只需要发送如下数据:

    $http({
      method: 'PUT',
      url: "http://dbadmin:password@IP.ADDR:5984/databasename/_security",
      data: JSON.stringify({admins: {names: ['"' + userID + '"'], roles: []}, readers: {names: [], roles: ['"myreaders"']}})
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多