每个用户验证一个 db 的 Cloudant
Authenticating Cloudant one db per user
我提前道歉 - 因为这个问题需要一些背景知识,这可能是冗长的:
我正在尝试构建一个使用 PouchDb 离线工作的应用程序。 PouchDb 将与 Cloudant 同步。
使用的技术:
Hapi、SQL、Vue、Cloudant、PouchDb
我构建了一个小 hapi.js 服务来注册/验证用户。 "account owner" 注册时 - 他们将作为新用户添加到 SQL 数据库。
使用 Cloudants API,我提供了一个新数据库(使用随机名称),并在数据库上设置了安全性以便新用户可以访问。
我将安全性(数据库名称、用户名和密码)作为元数据保存回 SQL 数据库中的用户。
与此处非常相似的方法:https://www.bennadel.com/blog/3208-provisioning-cloudant-couchdb-databases-from-auth0-for-a-database-per-user-architecture-in-angular-2-4-1.htm(实际上,我基于此)。
当 "account owner" 登录时,查询 SQL 数据库 - 检索元数据并将其发送到客户端 vue 应用程序。然后用 Cloudant 数据库名称、用户名和密码填充 PouchDB 远程字符串。
例如:
const remoteDB = new PouchDB(`https://${name}:${pass}@0000-0000-bluemix.cloudant.com/${DBname}`);
一切正常:PouchDB 可以与 Cloudant 通信 - 数据来回无问题。
"Account owner" 能够向其他人 ("Staff") 提供 read/write 访问他们的 cloudantDB 的权限。当他们添加新员工时,该员工将添加到 SQL 数据库中。使用 cloudants API,我为该用户创建了新的安全凭证,以便他们可以访问数据库-(我没有创建新的数据库)并将它们作为元数据保存到 SQL 数据库中的工作人员...
新员工收到一封电子邮件 - 他们在 SQL 数据库上设置了他们的用户名和密码,然后可以登录。Cloudant 元数据被提取......等等......PouchDB / Couchdb 相互交谈 - 这也有效。
最初我有点担心将此元/凭据发送到客户端 - 我想使用 JWT 或其他东西......但后来我看到了另一个问题的答案:
所以传递凭据似乎是它在 Pouch/Couch/Cloudant 等中的做法。我必须说实话 - 我发现整个事情就像 'magic' - 就像它太好了一样是的,这让我有点担心,因为我不太明白。我可能做错了什么。
现在回答我的问题:
我正在传递这些凭据 - 这安全吗?我将如何重置/超时用户名和密码。
当他们注销时,我从 Pouch 中擦除数据?
用户可以 'logged in' 并失去连接吗?重新连接后袋会同步吗?
如果 pouch 未同步 - 而他们注销(我擦除 Pouch)是否意味着他们会丢失数据?所以我想当他们再次登录时我需要将数据保存在 Pouch 中吗?
但是如果他们使用的是共享计算机怎么办?这些数据会存放在 Pouch DB 中等待某人登录吗?
我也不确定如何验证数据...确保保存到数据库的数据有效等...
我想我只是想弄清楚这个问题 - 我一直在谷歌搜索和阅读我能做的一切,但它并没有完全回答我的问题。
谢谢
[** 刚刚有个想法...
考虑一下,我实际上不需要在 SQL 数据库中创建员工用户。
帐户所有者已设置 - 在 Cloudant 中创建了数据库,并应用了凭据。
不只是有一个想法:理论上,当一个工作人员被添加时——我只需要在 Cloudant 中设置他们,并将他们的 ID 作为元数据写入 "Account Owner",这样他们就可以被删除等等
这样,工作人员可以直接登录到 Cloudant 数据库。
但是,我使用 Cloudants API 生成安全凭证 - 因此工作人员不会知道他们的用户名和密码是什么。我不想通过电子邮件发送用户名和密码。
有什么办法可以解决这个问题吗?创建安全凭证时我可以指定用户名和密码吗?我如何处理 cloudant 上的密码重置之类的事情?]
谢谢
I'm passing these credentials down - is this safe?
如果您的网站是通过 HTTPS 提供服务的,那么坏人会发现很难在飞行中收集到 Cloudant 用户名和密码。您的客户端应用程序需要将您的应用程序的凭据保留为 "logged in"(以便它保留与服务器同步的权利)。我喜欢将数据保留在 PouchDB 文档中(例如 _local/auth
- 本地文档不会被复制,因此仅驻留在您创建它们的设备上)。然而,您担心数据库凭据在客户端计算机上浮动是正确的。有些人认为这是不可接受的并实现了他们自己的中间层。如果您不需要 sync(即可以在客户端和服务器端更改数据),您可以使用 PouchDB 作为未同步数据的缓冲区并将其推送到您自己的 API 当你在线时。然后,您可以从您自己的服务器端代码控制身份验证、超时和对数据库的访问。
How would I reset / time out the username and password.
您可以 "log out" 通过:
- 正在删除您的客户端状态,例如删除
_local/auth
文档。
- 使key/password在客户端没有权限。没有 _reader/_writer/_replicator 权限,Cloudant api 密钥和密码是无用的
或者,您可以将用户名和密码传输给客户端,客户端可以将它们用于 Cloudant POST /_session 端点,从而为 Web 浏览器提供限时 cookie。然后,您的应用可以 "forget" 凭据,直到它再次需要它们。
When they log out, I wipe the data from Pouch?
是的。
Can a user be 'logged in' and lose connection? Will pouch sync when they reconnect?
如果您正确编写客户端应用程序,无论是否有互联网连接,它都可以完美地处理其本地 PouchDB 数据。这被称为 Offline First 方法。只要您的凭据仍然有效,您的应用程序就可以在重新建立连接时同步。
If pouch has NOT synced - and they log out (and I wipe Pouch) that would mean they would lose their data?
正确。如果您只有一份数据并将其删除,您将丢失数据:)
But what if they are using a shared computer? This data would be sat in Pouch DB waiting for someone to log in?
正确。在共享计算机上,另一个用户的数据可能对第二个用户可见。就像我在共享计算机上离开我的 Facebook 会话一样。
我提前道歉 - 因为这个问题需要一些背景知识,这可能是冗长的:
我正在尝试构建一个使用 PouchDb 离线工作的应用程序。 PouchDb 将与 Cloudant 同步。
使用的技术: Hapi、SQL、Vue、Cloudant、PouchDb
我构建了一个小 hapi.js 服务来注册/验证用户。 "account owner" 注册时 - 他们将作为新用户添加到 SQL 数据库。
使用 Cloudants API,我提供了一个新数据库(使用随机名称),并在数据库上设置了安全性以便新用户可以访问。
我将安全性(数据库名称、用户名和密码)作为元数据保存回 SQL 数据库中的用户。
与此处非常相似的方法:https://www.bennadel.com/blog/3208-provisioning-cloudant-couchdb-databases-from-auth0-for-a-database-per-user-architecture-in-angular-2-4-1.htm(实际上,我基于此)。
当 "account owner" 登录时,查询 SQL 数据库 - 检索元数据并将其发送到客户端 vue 应用程序。然后用 Cloudant 数据库名称、用户名和密码填充 PouchDB 远程字符串。
例如:
const remoteDB = new PouchDB(`https://${name}:${pass}@0000-0000-bluemix.cloudant.com/${DBname}`);
一切正常:PouchDB 可以与 Cloudant 通信 - 数据来回无问题。
"Account owner" 能够向其他人 ("Staff") 提供 read/write 访问他们的 cloudantDB 的权限。当他们添加新员工时,该员工将添加到 SQL 数据库中。使用 cloudants API,我为该用户创建了新的安全凭证,以便他们可以访问数据库-(我没有创建新的数据库)并将它们作为元数据保存到 SQL 数据库中的工作人员...
新员工收到一封电子邮件 - 他们在 SQL 数据库上设置了他们的用户名和密码,然后可以登录。Cloudant 元数据被提取......等等......PouchDB / Couchdb 相互交谈 - 这也有效。
最初我有点担心将此元/凭据发送到客户端 - 我想使用 JWT 或其他东西......但后来我看到了另一个问题的答案:
所以传递凭据似乎是它在 Pouch/Couch/Cloudant 等中的做法。我必须说实话 - 我发现整个事情就像 'magic' - 就像它太好了一样是的,这让我有点担心,因为我不太明白。我可能做错了什么。
现在回答我的问题:
我正在传递这些凭据 - 这安全吗?我将如何重置/超时用户名和密码。
当他们注销时,我从 Pouch 中擦除数据?
用户可以 'logged in' 并失去连接吗?重新连接后袋会同步吗?
如果 pouch 未同步 - 而他们注销(我擦除 Pouch)是否意味着他们会丢失数据?所以我想当他们再次登录时我需要将数据保存在 Pouch 中吗?
但是如果他们使用的是共享计算机怎么办?这些数据会存放在 Pouch DB 中等待某人登录吗?
我也不确定如何验证数据...确保保存到数据库的数据有效等...
我想我只是想弄清楚这个问题 - 我一直在谷歌搜索和阅读我能做的一切,但它并没有完全回答我的问题。
谢谢
[** 刚刚有个想法...
考虑一下,我实际上不需要在 SQL 数据库中创建员工用户。
帐户所有者已设置 - 在 Cloudant 中创建了数据库,并应用了凭据。
不只是有一个想法:理论上,当一个工作人员被添加时——我只需要在 Cloudant 中设置他们,并将他们的 ID 作为元数据写入 "Account Owner",这样他们就可以被删除等等
这样,工作人员可以直接登录到 Cloudant 数据库。
但是,我使用 Cloudants API 生成安全凭证 - 因此工作人员不会知道他们的用户名和密码是什么。我不想通过电子邮件发送用户名和密码。
有什么办法可以解决这个问题吗?创建安全凭证时我可以指定用户名和密码吗?我如何处理 cloudant 上的密码重置之类的事情?]
谢谢
I'm passing these credentials down - is this safe?
如果您的网站是通过 HTTPS 提供服务的,那么坏人会发现很难在飞行中收集到 Cloudant 用户名和密码。您的客户端应用程序需要将您的应用程序的凭据保留为 "logged in"(以便它保留与服务器同步的权利)。我喜欢将数据保留在 PouchDB 文档中(例如 _local/auth
- 本地文档不会被复制,因此仅驻留在您创建它们的设备上)。然而,您担心数据库凭据在客户端计算机上浮动是正确的。有些人认为这是不可接受的并实现了他们自己的中间层。如果您不需要 sync(即可以在客户端和服务器端更改数据),您可以使用 PouchDB 作为未同步数据的缓冲区并将其推送到您自己的 API 当你在线时。然后,您可以从您自己的服务器端代码控制身份验证、超时和对数据库的访问。
How would I reset / time out the username and password.
您可以 "log out" 通过:
- 正在删除您的客户端状态,例如删除
_local/auth
文档。 - 使key/password在客户端没有权限。没有 _reader/_writer/_replicator 权限,Cloudant api 密钥和密码是无用的
或者,您可以将用户名和密码传输给客户端,客户端可以将它们用于 Cloudant POST /_session 端点,从而为 Web 浏览器提供限时 cookie。然后,您的应用可以 "forget" 凭据,直到它再次需要它们。
When they log out, I wipe the data from Pouch?
是的。
Can a user be 'logged in' and lose connection? Will pouch sync when they reconnect?
如果您正确编写客户端应用程序,无论是否有互联网连接,它都可以完美地处理其本地 PouchDB 数据。这被称为 Offline First 方法。只要您的凭据仍然有效,您的应用程序就可以在重新建立连接时同步。
If pouch has NOT synced - and they log out (and I wipe Pouch) that would mean they would lose their data?
正确。如果您只有一份数据并将其删除,您将丢失数据:)
But what if they are using a shared computer? This data would be sat in Pouch DB waiting for someone to log in?
正确。在共享计算机上,另一个用户的数据可能对第二个用户可见。就像我在共享计算机上离开我的 Facebook 会话一样。