CouchDB cookie是否具有滑动过期时间?

16
我计划在我的应用中使用CouchDB内置的cookie身份验证(请注意,这不是CouchApp,我在客户端和数据库之间使用Web服务器)。
因此,当用户首次使用其凭据登录时:
  • 凭据通过Web服务器从Web客户端发送到CouchDB
  • CouchDB对凭据进行身份验证并返回一个Set-Cookie
  • 该头被发送到Web客户端,并意味着所有后续的数据库操作请求只需通过Web服务器将Cookie头传递给CouchDB。
虽然我已经能够确定:

默认情况下,您可以使用[cookie]令牌保持10分钟。 10分钟后,您需要再次验证用户。 令牌生存期可以在couch_httpd_auth配置部分中的超时(以秒为单位)设置中配置。

但我不清楚这10分钟时间段是否是(或是否可以设置为)滑动窗口。
如果用户在整个10分钟内继续使用应用程序(在每个请求中发送cookie),那么这是否意味着cookie会自动重新设置(以类似于.NET中的FormsAuthentication cookies的方式),直到10分钟的“不活动”期? 参考资料
1个回答

33

对于浏览器而言,(可配置的)10分钟时间段是一个滑动窗口。每次CouchDB响应请求时,它都会将cookie更新为一个新值,有效地刷新登录状态。

对于客户端而言,在看到Set-Cookie头信息时,你必须记得重置cookie的值(或在你的情况下将其传递给你自己的客户端)。

举个例子,我将超时时间设置为30秒:

$ curl http://admin:admin@localhost:5984/_config/couch_httpd_auth/timeout
"30"

接下来我将会:

  1. 登录
  2. 稍等一段时间
  3. 在超时之前通过 cookie 检查我的会话
  4. 等待超时
  5. 在超时后再次使用 cookie 检查我的会话
  6. (快速地)使用步骤 3 中设置的新 cookie CouchDB 再次检查我的会话

请注意,第一个确认显示了{"name":"me"}(表示我已经登录);第二个显示了{"name":null}(表示我已经注销);但第三个又显示了{"name":"me"}(由于使用了更新后的 cookie,我仍然登录着)。

$ curl -X POST -i localhost:5984/_session -d name=me -d password=secret
HTTP/1.1 200 OK
Set-Cookie: AuthSession=bWU6NEY5QjQ3QTA6Ao6zetUZUxkno37ULd2qdRRjmsc; Version=1; Path=/; HttpOnly
Server: CouchDB/1.2.0 (Erlang OTP/R15B)
Date: Sat, 28 Apr 2012 01:28:00 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 35
Cache-Control: must-revalidate

{"ok":true,"name":"me","roles":[]}

$ sleep 20

$ curl -i localhost:5984/_session -H Cookie:AuthSession=bWU6NEY5QjQ3QTA6Ao6zetUZUxkno37ULd2qdRRjmsc
HTTP/1.1 200 OK
Set-Cookie: AuthSession=bWU6NEY5QjQ3QkM6WonDdsAdO8p7QUlLWCZQXVAfcvU; Version=1; Path=/; HttpOnly
Server: CouchDB/1.2.0 (Erlang OTP/R15B)
Date: Sat, 28 Apr 2012 01:28:28 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 165
Cache-Control: must-revalidate

{"ok":true,"userCtx":{"name":"me","roles":[]},"info":{"authentication_db":"_users","authentication_handlers":["oauth","cookie","default"],"authenticated":"cookie"}}

$ sleep 10

$ curl -i localhost:5984/_session -H Cookie:AuthSession=bWU6NEY5QjQ3QTA6Ao6zetUZUxkno37ULd2qdRRjmsc
HTTP/1.1 200 OK
Server: CouchDB/1.2.0 (Erlang OTP/R15B)
Date: Sat, 28 Apr 2012 01:28:43 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 140
Cache-Control: must-revalidate

{"ok":true,"userCtx":{"name":null,"roles":[]},"info":{"authentication_db":"_users","authentication_handlers":["oauth","cookie","default"]}}

$ curl -i localhost:5984/_session -H Cookie:AuthSession=bWU6NEY5QjQ3QkM6WonDdsAdO8p7QUlLWCZQXVAfcvU
HTTP/1.1 200 OK
Set-Cookie: AuthSession=bWU6NEY5QjQ3RDA69pqrNVd-ClZ7_v4SkcghdZRRhCs; Version=1; Path=/; HttpOnly
Server: CouchDB/1.2.0 (Erlang OTP/R15B)
Date: Sat, 28 Apr 2012 01:28:48 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 165
Cache-Control: must-revalidate

{"ok":true,"userCtx":{"name":"me","roles":[]},"info":{"authentication_db":"_users","authentication_handlers":["oauth","cookie","default"],"authenticated":"cookie"}}

在CouchDB 1.2.0及更高版本中,您可以设置_config/couch_httpd_auth/allow_persistent_cookies"true",这会使事情变得更加容易看到。Cookie将具有明显的"Expires"标志,您可以看到它始终设置为当前时间加上超时值。


每次CouchDB响应请求时,它都会将cookie更新为新值。但是我在CouchDB 1.2上没有看到这一点;我只在登录或注销时看到任何Set-Cookie头(无论allow_persistent_cookies是true还是false)。 - natevw
更新:那么在Firefox中,如果我直接导航到一个URL,我会看到API响应中的Set-Cookie头...但是对于Futon发出的请求的响应却没有看到? 耸肩 - natevw
3
我想我明白了:如果cookie仍处于其生命周期的前10%内,则不会重置它(https://github.com/apache/couchdb/blob/master/src/couchdb/couch_httpd_auth.erl#L196)。因此,在持续的请求流中,可能很容易错过偶尔的Set-Cookie响应。 - natevw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接