19

我正在 Cloudant 上设置 CouchDB,我很困惑,因为 Cloudant 的身份验证方式似乎与常规 CouchDB 不同。具体来说,Cloudant 似乎缺少_users数据库。

我在这里阅读了 Cloudant auth FAQ ,它提供了以下说明:

我可以在 Cloudant 上使用 CouchDB 安全功能(_users 数据库、安全对象、验证函数)吗?

是的你可以。如果要使用 _users 数据库,您必须首先关闭 Cloudant 自己的安全性,以便通过 _users 管理角色。为此,您需要将如下所示的 JSON 文档放入数据库的 _security 端点(例如 https://USERNAME.cloudant.com/DATABASE/_security):

{ "cloudant": { "nobody": ["_reader", "_writer", "_admin"] }, "readers": { "names":["demo"],"roles":[] } }

这些说明运行良好,并允许我更新数据库的 _security 对象。

不清楚的是如何设置 _users 数据库。它不是自动存在的,所以我尝试使用常规创建它:

curl -X PUT $COUCH/_users

这很好用,但是当我尝试将新用户添加到 _users 时,如下所示:

curl -HContent-Type:application/json \
  -vXPUT $COUCH/_users/org.couchdb.user:me \
  --data-binary '{"_id": "org.couchdb.user:me","name": "me","roles": [],"type": "user","password": "pwd"}'

似乎可以正确创建文档:

{"ok":true,"id":"org.couchdb.user:me","rev":"3-86c3801fdb8c32331f5f2580e861a765"}

但是 Cloudant 上 _users 中的新用户缺​​少散列密码:

{
   "_id": "org.couchdb.user:me",
   "_rev": "3-86c3801fdb8c32331f5f2580e861a765",
   "name": "me",
   "roles": [
   ],
   "type": "user",
   "password": "pwd"
}

因此,当我尝试对该用户进行身份验证时,出现以下错误:

{"error":"bad_request","reason":"missing password_sha property in user doc"}

在我的本地 CouchDB 安装中,在 _users 中创建新用户将自动创建散列密码:

{
   "_id": "org.couchdb.user:test",
   "_rev": "1-9c1c4360eba168468a37d7f623782d23",
   "password_scheme": "pbkdf2",
   "iterations": 10,
   "name": "test",
   "roles": [
   ],
   "type": "user",
   "derived_key": "4a122a20c1a8fdddb5307c29078e2c4269abffa5",
   "salt": "36c0c05cf2a3ee321eabd10c46a8aa2a"
}

我尝试将“_design/_auth”文档从本地 CouchDB 安装复制到 Cloudant,但结果相同 - 没有散列密码。

我似乎在某个时候出轨了,但我不确定这发生在哪里。如何设置 Cloudant 以使用与常规 CouchDB 相同类型的身份验证?

4

3 回答 3

12

我通过#cloudant IRC 找到了答案:

09:59 <+kocolosk> 创建 _users 是正确的做法

09:59 <+kocolosk> API 匹配旧版本的 CouchDB,其中密码需要散列客户端

10:00 <jbeard> 哦,我明白了

10:00 <+kocolosk> 我们正在解决对自动散列的支持不足的问题

10:01 < jbeard> 我正在尝试在 Couch 中查找有关客户端散列的文档。

10:02 < jbeard> Cloudant 的目标是与哪个版本的 Couch 兼容以供 _users 使用?

10:04 <+kocolosk> jbeard:http ://wiki.apache.org/couchdb/Security_Features_Overview

10:04 <+kocolosk> 参见“生成密码_sha(仅适用于 1.1.x 及更早版本)”

10:04 <+kocolosk> jbeard:这个特殊功能是我们与 1.1.x 兼容但不兼容新版本的最后一点

10:05 <jbeard> 优秀

10:05 < jbeard> 这就是我需要知道的

于 2013-08-04T14:13:23.727 回答
1

实际上,cloudant 不支持哈希值生成。我发现这种替代方法有助于在 cloudant 服务中使用 _users 数据库...

https://github.com/doublerebel/cloudant-user

于 2015-08-09T23:45:51.450 回答
1

截至 2020 年,Cloudant 对密码进行散列处理,但不使用与 CouchDB 当前使用的散列算法 (pbkdf2) 相同的散列算法。为了更好的安全性和兼容性,仍然建议您自己生成哈希,例如使用couch-pwd

而不是提供

{ "cloudant": { "nobody": ["_reader", "_writer", "_admin"] }, "readers": { "names":["demo"],"roles":[] } }

文档现在建议使用该couchdb_auth_only标志:

{
  "couchdb_auth_only": true,
  "members": {
      "names": ["demo"],"roles":[]
  },
  "admins": {
      "names": ["admin"],"roles":[]
  }
}

但请注意,_admin角色不会像在 CouchDB 3 中那样自动设置。

于 2020-07-07T12:02:32.430 回答