16

我计划为我的应用程序使用 CouchDB 的内置 cookie 身份验证(请注意,这不是 CouchApp,我在客户端和数据库之间使用 Web 服务器)。

因此,当用户首次使用其凭据登录时:

  • 凭据通过 Web 服务器从 Web 客户端发送到 CouchDB
  • CouchDB 验证凭据并返回Set-Cookie标头
  • 这个标头被发送到 Web 客户端,这意味着所有后续的数据库操作请求都只是通过CookieWeb 服务器将标头传递给 CouchDB。

虽然我已经能够确定:

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

我不清楚这 10 分钟的时间段是否(或可以设置为)滑动窗口。

我的意思是;如果用户继续使用应用程序整整 10 分钟(在每个请求上发送 cookie),cookie 是否会自动重新设置(以类似于 .NET 中的 FormsAuthentication cookie 的方式)直到一段时间不活动10分钟?

使用的参考文献

4

1 回答 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 将有一个明显的“过期”标志,您可以看到它始终设置为当前时间加上您的超时值。

于 2012-04-28T01:35:26.170 回答