CouchDB 2是否跨节点同步用户会话?
我目前正在进行docker compose设置,可用于部署CouchDB 2节点集群。我终于让节点正常工作,数据在节点间同步,但除非我弄错了,否则CouchDB似乎不会同步用户会话 我的设置有3个节点,使用的haproxy设置几乎与相同。根据我的配置,haproxy将端口5984上的传入流量路由到所有3个节点上的端口5984 假设管理员用户名为CouchDB 2是否跨节点同步用户会话?,couchdb,couchdb-2.0,Couchdb,Couchdb 2.0,我目前正在进行docker compose设置,可用于部署CouchDB 2节点集群。我终于让节点正常工作,数据在节点间同步,但除非我弄错了,否则CouchDB似乎不会同步用户会话 我的设置有3个节点,使用的haproxy设置几乎与相同。根据我的配置,haproxy将端口5984上的传入流量路由到所有3个节点上的端口5984 假设管理员用户名为root,密码为password 我第一次登录时使用: curl -vX POST http://localhost:5984/_session -H '
root
,密码为password
我第一次登录时使用:
curl -vX POST http://localhost:5984/_session -H 'Content-Type: application/x-www-form-urlencoded' -d 'name=root&password=password'
注意,返回的AuthSession在下面用作AuthSession
然后,我发表以下声明:
curl -X PUT http://localhost:5984/mydb --cookie AuthSession=AUTHSESSION -H "X-CouchDB-WWW-Authenticate: Cookie" -H "Content-Type: application/x-www-form-urlencoded"
这通常会因为“您不是服务器管理员”而失败。我可以继续发出相同的PUT,并且最终会成功,因为我假设haproxy最终会将请求路由到我通过身份验证的单个节点。由于haproxy使用循环,我命中目标节点的概率为1/3
我认为CouchDB 2可以处理跨节点的同步用户会话。我是在做一个愚蠢的假设吗
(请参阅以复制我的设置)
使用我的docker compose设置的特定解决方案进行更新
按照@lossleader的说法,您需要在[coach_httpd_auth]部分中设置秘密,以便它在节点之间是相同的。此外,您需要在[admins]部分设置相同的管理员用户名和密码。我在这里遗漏的细节是,所有节点在.ini文件中必须具有完全相同的密码哈希值。拥有相同的明文密码是不够的,否则,每个节点将生成自己的salt并生成不同的散列
有关我的完整设置,请参阅。CouchDB会话令牌只是用户密码、服务器密码和时间的HMAC散列。会话根本不存储在CouchDB中,即使在单节点系统上也是如此。所以没有什么可以同步的 你可以,而且很多人都可以,在CouchDB之外完全以编程方式生成会话。简短回答:是的 长答覆: 正如其他人所评论的,couchdb不知道自己创建的会话,因此确实没有同步会话的机制,但是在集群的一个节点上创建的会话cookie在其他节点上有效之前,您需要自己同步两个非会话的内容
[coach\u httpd\u auth]
secret=foo
这是用于对会话cookie进行签名的机密值。如果请求会话cookie时不存在,则将其设置为随机值。集群的每个节点自然会生成不同的值
因此,在启动之前,将该值设置为一个较大的随机值,但在集群的所有节点上都相同
[管理员]
foo=-pbkdf2-2cbae77dc3d2dadb43ad477d312931c617e2a726,CD135AD4D6EB4D2F916CBA7593C3CE7,10
本节包含每个管理员用户的salt密码哈希。盐包含在会话cookie的签名中。在密码更改时,salt会重新随机化,因此包含salt的效果是,它会使密码更改之前的会话cookie无效
您还需要该部分在所有节点上都相同。对管理员密码进行哈希运算时,每个节点将生成一个随机salt
最好在外部生成此部分,作为节点资源调配自动化的一部分
我希望这能让你开始。我们希望在将来的版本中改进这种情况,它显然反映了couchdb的预群集版本。您在每个节点上设置了相同的机密吗@lossleader,刚刚尝试在local.ini中设置它,不幸的是,它似乎没有什么区别。如果现在的秘密是一样的,我认为区别在于节点可能被允许分别对管理员用户进行加密/加密,我会在它运行后将一个节点的管理员行复制到我的配置中。@lossleader,你完全正确!我修改了我的配置,以便后续节点从第一个节点获取准确的密码,并且它可以工作: