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

Posted

技术标签:

【中文标题】iOS/OS X 日历应用和 CalDAV 服务自动发现【英文标题】:iOS/OS X calendar app and CalDAV service autodiscovery 【发布时间】:2014-05-27 21:28:43 【问题描述】:

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

我希望能够在 ios/OS X 应用程序中使用自动服务发现。所以,如果我在我的 Mac 或 iPad 上设置了 CalDAV 帐户,我希望我只输入我的服务器名称、用户名/密码,而不是输入任何 URL 左右。

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

所以,如果我将我的 DAV 服务器根放在 /dav/ 中,我现在正在从 /.well-known/caldav 执行 302 到 /dav/ 的 URL。

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

    PROPFIND /.well-known/caldav HTTP/1.1 302 39 "-" "iOS/7.1.1 (11D201) accountsd/1.0" PROPFIND /dav/ HTTP/1.1 401 - "-" "iOS/7.1.1 (11D201) accountsd/1.0" PROPFIND /dav/ HTTP/1.1" 207 - "-" "iOS/7.1.1 (11D201) accountsd/1.0"

第一个请求是上述服务自动发现。一切正常,服务器向 /dav/ 回复 302。

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

第三行是正确验证的 DAV 请求(我可以在我的身份验证后端日志和 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】:

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

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

【讨论】:

您是如何解除对 OPTIONS 请求的阻止的?即使我面临类似的问题,我的 caldav 服务器也适用于 macOS,但在 iOS 中,选项请求后显示“CalDAV 帐户验证失败”。

以上是关于iOS/OS X 日历应用和 CalDAV 服务自动发现的主要内容,如果未能解决你的问题,请参考以下文章

使用 CalDav API 集成 Yahoo 日历

列出 CalDAV 上可供用户使用的日历 (Bedework)

列出CalDAV(Bedework)上可供用户使用的日历

iCloud日历删除事件请求不适用于caldav

为站点成员发布 CalDav 事件并管理参与者

ICloud Caldav连接获取日历