nginx + php- fpm サーバーで、それぞれ SabreDAV と jQuery に基づいてcarddav サーバーとクライアントを実行しています。通常はログインできますが、例外が 1 つあります。しばらくすると、おそらくログイン試行の失敗が原因で、シークレット モードまたは一時的なバニラ設定フォルダーを使用しない限り、Chrome でログインできなくなります。コンソールに、次のエラー メッセージが表示されます。
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 では問題はありませんが、ブラウザ認証のポップアップが表示されることがあります。