0

在 nginx+php-fpm 服务器上,我分别运行基于 SabreDAV 和 jQuery的carddav 服务器客户端。我可以正常登录,但有一个例外:一段时间后,可能由于登录尝试失败,我无法再使用 Chrome 登录,除非我使用隐身模式或临时 vanilla 首选项文件夹。在控制台中,我看到以下错误消息:

PROPFIND https://user:password@dav.server.com/d/card.php/principals/ 207 (Multi-Status) jquery.js:8434
send jquery.js:8434
jQuery.extend.ajax jquery.js:7986
[...]
Error: [netCheckAndCreateConfiguration: 'https://dav.server.com/d/card.php/principals/'] code: '401' webdav_protocol.js:135

服务器端日志似乎在登录失败和成功之间没有一点区别。客户端,拥有来自 HTML 表单的凭据,发送他们的 ajax 请求,获得 401 响应并使用正确的身份验证标头重试,正如您从开发工具信息中看到的那样:

Request URL:https://user:password@dav.server.com/d/card.php/principals/
Request Method:PROPFIND
Status Code:207 Multi-Status
Request Headersview source
Accept:application/xml, text/xml, */*; q=0.01
Accept-Charset:UTF-8,*;q=0.5
Accept-Encoding:gzip,deflate,sdch
Accept-Language:el,en;q=0.8,en-US;q=0.6
Authorization:Digest username="user", realm="BaikalDAV", nonce="516d8f8577751", uri="/d/card.php/principals/", response="53a29333f913bc5824d9ae94d4cdd573", opaque="df58bdff8cf60599c939187d0b5c54de", qop=auth, nc=00000001, cnonce="e22cc240959fa57b"
Connection:keep-alive
Content-Length:122
Content-Type:text/xml; charset=UTF-8
Cookie:PHPSESSID=3f9bfd0909ba6f95888c525a3281f3c3
Depth:0
Host:dav.server.com
Origin:https://dav.server.com
Referer:https://dav.server.com/contacts/
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko)  Chrome/25.0.1364.160 Safari/537.22
X-client:CardDavMATE 0.10.1 (INF-IT CardDAV Web Client)
X-Requested-With:XMLHttpRequest

服务器接受凭据并使用207 Multi-status以下标头进行响应:

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:keep-alive
Content-Type:application/xml; charset=utf-8
Date:Tue, 16 Apr 2013 17:51:01 GMT
DAV:1, 3, extended-mkcol, addressbook, access-control, calendarserver-principal-property-search
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Pragma:no-cache
Server:nginx/1.3.15
Transfer-Encoding:chunked
Vary:Brief,Prefer
X-Powered-By:PHP/5.3.23

这个身体:

<?xml version="1.0" encoding="utf-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:card="urn:ietf:params:xml:ns:carddav">
  <d:response><d:href>/d/card.php/principals/</d:href>
      <d:propstat>
          <d:prop>
               <d:current-user-principal><d:href>/d/card.php/principals/user/</d:href></d:current-user-principal>
          </d:prop>
          <d:status>HTTP/1.1 200 OK</d:status>
      </d:propstat>
  </d:response>
</d:multistatus>

在隐身模式下,调用 jQuery 中的成功回调,客户端应用程序继续并按预期工作。在正常模式下,即使与服务器交换了相同的确切信息,也会调用错误回调。即使我清除了在 Chrome 版本 25.0.1364.160 Debian 7.0 (186726) 中可以找到的所有私人数据、密码和任何其他选项,也会发生这种情况。

我已经看到了很多关于从 Chrome 清除身份验证数据的问题,并且我尝试了通常的建议(比如在 URL 中使用 user@ 向服务器发送请求),但我手动发送请求没有问题。只是 ajax 调用似乎完全没有理由失败。

在 Firefox 中我没有问题,只是有时会弹出浏览器身份验证。

4

1 回答 1

0

我最终转而使用 Firefox。另一种选择是修补 Baikal 以使用 http 基本身份验证。至少根据 carddavmate 开发人员的说法。

于 2013-04-27T10:24:56.667 回答