【问题标题】:Secure client-side couchApp / couchDB user authentication安全客户端 couchApp / couchDB 用户身份验证
【发布时间】:2012-03-18 11:48:48
【问题描述】:

背景研究:

User Signup in Couchapp/CouchDB through jquery.couch.js or Otherwise

http://blog.couchbase.com/what%E2%80%99s-new-couchdb-10-%E2%80%94-part-4-security%E2%80%99n-stuff-users-authentication-authorisation-and-permissions

https://issues.apache.org/jira/browse/COUCHDB-1175 - 特别是“Ari Najarian”的帖子

问题:

解释一下我在上面发布的 SO 问题:

“基本上我想要一个注册表单,用于在 couchdb 中为 couchapp 注册一个帐户。这将需要在 couchdb _users 数据库中创建一个新用户,并创建一个新数据库,新用户分配数据库管理员的角色。所有这些都需要服务器管理员凭据。"

上一个问题的答案涉及使用以管理员身份登录到 couchdb 的外部单独服务器来监控 couchdb 并根据需要修改 couchdb 以响应来自客户端的某些数据事件。

我的问题是 - 这是唯一的方法吗?这不是破坏了 couchdb 的 2 层网络堆栈的全部目的吗?有没有办法从验证函数中修改 couchdb 数据库,该函数在“内部”/单独以管理员身份登录时检查“type == user”文档?

如果有一些直接的方法可以做到这一点,我很抱歉,我只是没有找到正确的文档。

额外问题说明:

  1. 有一个 couchdb 实例位于一个 Internet 地址。
  2. 此沙发数据库为随机客户端提供 html 页面和包含注册/登录表单的嵌入式 javascript 脚本。
  3. 客户输入注册信息(姓名、密码)并提交
  4. JS 脚本使用 XMLHttpRequest 对象打开到 couchdb 实例的连接并发送...问题!

问题 #1 - 如果凭据存储在代码中(作为新用户数据库的验证发送),那么任何人都可以“查看 html 源代码”并接管数据库。

-或-

问题 #2 - 如果没有提供凭据并且请求是匿名发送的,那么将在 _users 数据库中创建一个新用户并发送成功回复消息。但是没有为用户创建新的数据库(并且不能没有管理员凭据),用户可以与之交互以用于特定于应用程序的目的(例如添加/删除数据)。并且 - 从上面的 couchbase 博客链接 - 如果您使用角色/名称来保护您的数据库以防止匿名读者和验证功能以防止匿名写入,那么匿名用户帐户(例如,想要注册数据库空间以使用app) 不能做任何事情,因为出于明显的安全原因,匿名用户不能指定他们希望拥有的任何角色。这意味着拥有 -functional- 用户的唯一方法是事先以管理员身份创建用户帐户 + 关联数据库,然后分发这些用户凭据 - 就像私人邀请系统一样,是吗?

重申一下,有没有什么办法,只使用 couchdb 和 couchdb 的身份验证处理程序、设计文档功能、客户端 ajax 等的某种组合,让连接的客户端注册并获取个人数据库(并且显然只使用该数据库) 他们可以访问并与之交互?

【问题讨论】:

  • 我在我的问题的“背景研究”部分列出了该问题(因此现在链接了 2 个问题)。我创建这篇文章是因为关于另一个问题的建议解决方案涉及向 couchdb 层添加另一个迷你层,我想知道是否有一个“纯”couchdb 解决方案。我会发布到上面的链接,但我不想劫持别人的问题。
  • 这个问题肯定是相关的。我想要一个纯粹且安全、仅限 couchdb 的解决方案
  • @gregm - 感谢您的建议。我之前访问过该链接,据我了解,这只是在 couchdb 实例的 _users 数据库中创建一个用户帐户,而不是该用户管理的关联数据库。来自链接:“” * 用户通过 BrowserID 而不是密码登录 * 用户第一次登录时,CouchDB 将为他们创建一个帐户。 "" 所以它看起来像是匿名用户在数据库中创建非功能帐户的过程的包装器。

标签: authentication couchdb couchapp


【解决方案1】:

This 不是纯沙发解决方案,而是沙发 + 节点,可以解决您的问题:

您好,我已经有一段时间没来了,也没有意识到这是被编辑/删除的链接(加上链接不是答案的政策!对不起......)。我一直在一个与您尝试做的非常相似的项目上使用 couchdb,不幸的是,如果不使用其他服务来处理管理员级别的访问和用户数据库的创建,就无法完成您想要完成的工作。 Syncpoint-API 可以用来促进这一点,但它实际上是一个处理注册/登录和专用数据库设置的 nodejs 服务。

不过,到目前为止,Syncpoint 已被证明不是 100% 可靠的,而且它似乎确实是一个废弃的项目,因为 CouchBase 从 CouchDB 开发人员那里吸走了所有的研发资源。

我现在转移到 nodejs + socket.io 作为传输层,使用节点握手并分配数据库,然后进一步观察服务器上的沙发 _changes api(通过另一个节点进程),然后转发 _changes通过socket.io到客户端。此外,我还运行了一些“纯”沙发应用程序,它们提供与私有数据混合的公共数据。

我的结论? CouchDB 是一款很棒的产品,具有一些很棒的功能,但对于更复杂的登录/授权方案以及实际开发所需的其他一般应用程序需求,它还没有准备好。

【讨论】:

  • 新用户您好,感谢您的回答。请至少发布解决方案的描述;根据指南,单独的链接不是答案(它们可能会被删除)。
  • @kfancy - 不用担心延迟更新,我也有几个月没有检查过这个问题了。您使用基于节点的迷你层作为 couchdb 的 _changes 提要和客户端请求之间的中介的解决方案也是另一个 Stack Overflow 问题的建议。我将继续选择您的答案作为“解决方案”,如果只是因为似乎没有任何迹象表明真正的解决方案 - 如在 couchdb 更新中 - 即将到来。感谢您分享处理此问题的经验。
猜你喜欢
  • 1970-01-01
  • 2013-08-19
  • 2021-05-05
  • 2019-04-07
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
相关资源
最近更新 更多