iOS / OS X日历应用程序和CalDAV服务自动发现

时间:2014-05-27 21:28:43

标签: ios calendar webdav caldav sabredav

我正在使用jsDAV库(SabreDAV库的JavaScript分支)构建自己的CalDAV服务器。 现在,我可以通过直接日历网址提供我的日历(因此我设置了后端,包括身份验证后端和日历后端)。

我希望能够在iOS / OS X应用程序中使用自动服务发现。因此,如果我在Mac或iPad上设置CalDAV帐户,我希望我只输入我的服务器名称,用户名/密码,而不是输入任何网址。

为此,我正在提供/.well-known/caldav地址which must redirect a client to a root of my CalDAV server

所以,如果我已将我的DAV服务器根目录放在/dav/我现在从/dav/执行302到/.well-known/caldav网址。

接下来,从服务器的角度来看,这是一个典型的iOS自动发现会话。可通过HTTPS访问的服务器(所有证书都有效,没有任何自签名证书),HTTP被禁用。

  1. PROPFIND /.well-known/caldav HTTP/1.1 302 39 "-" "iOS/7.1.1 (11D201) accountsd/1.0"
  2. PROPFIND /dav/ HTTP/1.1 401 - "-" "iOS/7.1.1 (11D201) accountsd/1.0"
  3. PROPFIND /dav/ HTTP/1.1" 207 - "-" "iOS/7.1.1 (11D201) accountsd/1.0"
  4. 第一个请求是上述服务自动发现。一切都很好,服务器回复302到/ dav /.

    第二行是/dav/没有身份验证标头的第一个请求。我回复'WWW-Authenticate': 'Basic realm="jsDAV"标题。

    第三行是经过正确认证的DAV请求(我可以在我的auth后端日志和jsDAV调试日志中看到它)。这是我在这里得到的:

    <?xml version="1.0" encoding="UTF-8"?>
    <A:propfind xmlns:A="DAV:">
        <A:prop>
            <A:current-user-principal/>
            <A:principal-URL/>
            <A:resourcetype/>
        </A:prop>
    </A:propfind>
    

    以下是我发回的内容:

    <?xml version="1.0" encoding="utf-8"?>
    <d:multistatus 
      xmlns:d="DAV:" 
      xmlns:a="http://ajax.org/2005/aml" 
      xmlns:cal="urn:ietf:params:xml:ns:caldav" 
      xmlns:cs="http://calendarserver.org/ns/" 
      xmlns:dav="urn:DAV">
       <d:response>
          <d:href>/dav/</d:href>
          <d:propstat>
             <d:prop>
                <d:current-user-principal>
                   <d:href>/dav/principals/me/</d:href>
                </d:current-user-principal>
                <d:resourcetype>
                   <d:collection/>
                </d:resourcetype>
             </d:prop>
             <d:status>HTTP/1.1 200 OK</d:status>
          </d:propstat>
        </d:response>
    </d:multistatus>
    

    在此之后(从我的观点来看,成功),iOS告诉我,它无法与我的服务器建立安全连接,并提供尝试不安全的服务。

    这里有什么问题?为什么iOS认为我的服务器坏了?

1 个答案:

答案 0 :(得分:2)

我找到了这份文件:http://wiki.wocommunity.org/display/~probert/CalDAV+and+CardDAV+handshake

我的问题的答案是:OPTIONS请求被我的前端服务器阻止了。因此,握手没有完全完成。