如何直接从 Web 浏览器安全地执行对 cloudant 的授权

how to securely perform authorization to cloudant directly from web browsers

我打算构建一个办公扩展应用程序(或多或少是一个 HTML5 应用程序)。应用程序最有价值的部分是应用程序提供的内容,因此内容信息必须安全地保存在数据库中。任何试图访问内容的人都必须出示用户名和密码来证明自己的身份。

我有一个名为“_users”的 Cloudant 数据库,它存储所有用户登录信息,例如用户名和密码,还有另一个名为“_contents”的 Cloudant 数据库,它存储所有内容信息。

当用户尝试使用他们的网络浏览器访问“_content”数据库时,应用程序将要求用户登录。将此用户的凭据与“_users”数据库中的数据成功匹配后,此用户便可以访问“_content”数据库。

我的理想情况是,登录和授权过程可以仅使用 Web 浏览器和 Cloudant 数据库完成。我不想在两者之间有任何 "middle person"(例如网络服务器 运行 nodejs)。我该怎么做。

好的,这里有一些我无法解决的问题。

  1. 当用户尝试与 Cloudant 数据库建立连接时,必须提供 API 密钥。好的,我可以生成一个允许读取“_users”数据库的 API 密钥,并将此 API 密钥提供给 user.a 用户可以使用此密钥连接到“_users”,但是这是否意味着使用此 API 键,任何用户都可以读取“_users”数据库中的所有数据?这将是一场灾难。
  2. 如果可以解决以上问题,如何进行授权?我应该继续为每个用户生成 APIs 并在以后删除它们吗?我应该在什么时候执行删除操作?

通常,Cloudant 不支持自定义用户名和密码,_users 数据库功能。相反,Cloudant 允许您创建 API 键,它们是随机字符串。

我认为,根据您的要求,上述系统将无法运行。但有个好消息! Cloudant 还支持开源 Apache CouchDB _users 数据库。我认为这对你有用;但是,您需要做一些工作来设置它。该解决方案需要您的 Web 服务器做一些 Cloudant 准备工作;然而,当用户使用该应用程序时,他们可以直接向 Cloudant 进行身份验证,并且可以直接读取和更新文档,不需要中间服务器。

启用姓名认证

Cloudant developer FAQ的最后一题,"Can I use CouchDB security features..."

基本上,对于每个 DB,您想 PUT 到 /the_db/_security

{ "couchdb_auth_only": true,
  "members": {
    "names": ["user_name_1", "user_name_2", "etc."],
    "roles": []
  }
}

设置用户帐户

这根据 Apache CouchDB 文档工作。基本上,您需要使用用户名和散列密码在 _users 中创建一个文档。 注意,Cloudant 还没有较新的 CouchDB 功能,服务器会自动为您散列密码:Cloudant auth: lacks _users database

正如答案所说,请参阅 CouchDB Wiki security page about hashing passwords. You will need to find a JavaScript SHA1 implementation, such as CryptoJS

CORS

您可能需要启用 CORS,Cloudant 文档中也对此进行了描述,CORS chapter

完成上述所有操作后,您可以创建用户(或通过更新 /_users/* 文档更改密码;这些用户可以使用基本身份验证或 cookie 身份验证登录,以访问其数据库。