Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CouchDB 2是否跨节点同步用户会话?_Couchdb_Couchdb 2.0 - Fatal编程技术网

CouchDB 2是否跨节点同步用户会话?

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 '

我目前正在进行docker compose设置,可用于部署CouchDB 2节点集群。我终于让节点正常工作,数据在节点间同步,但除非我弄错了,否则CouchDB似乎不会同步用户会话

我的设置有3个节点,使用的haproxy设置几乎与相同。根据我的配置,haproxy将端口5984上的传入流量路由到所有3个节点上的端口5984

假设管理员用户名为
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,你完全正确!我修改了我的配置,以便后续节点从第一个节点获取准确的密码,并且它可以工作: