Приложение календаря iOS/OS X и автообнаружение службы CalDAV

Я создаю свой собственный сервер CalDAV, используя библиотеку jsDAV (форк JavaScript библиотеки SabreDAV). Теперь я могу обслуживать свои календари по прямому URL-адресу календаря (поэтому у меня настроены серверные части, как серверная часть аутентификации, так и серверная часть календаря).

Я хочу иметь возможность использовать автоматическое обнаружение служб в приложениях iOS/OS X. Итак, если я настрою учетную запись CalDAV на своем Mac или iPad, я хочу просто ввести имя своего сервера, имя пользователя/пароль и не вводить какие-либо URL-адреса или что-то в этом роде.

Для этого я обслуживаю /.well-known/caldav адрес , который должен перенаправить клиента в корень моего сервера CalDAV

Итак, если у меня есть корень моего сервера DAV, помещенный в /dav/, я сейчас делаю 302 в URL-адрес /dav/ из /.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"

Первый запрос — это описанная выше служба автообнаружения. Здесь все в порядке, сервер отвечает 302 на /dav/.

Вторая строка — это первый запрос к /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 считает, что мой сервер неисправен?


person Olegas    schedule 27.05.2014    source источник


Ответы (1)


Я нашел этот документ: http://wiki.wocommunity.org/display/~probert/CalDAV+and+CardDAV+handshake

Ответ на мой вопрос: запрос OPTIONS был заблокирован моим внешним сервером. Итак, рукопожатие не было полностью завершено.

person Olegas    schedule 28.05.2014
comment
Как вы разблокировали запрос OPTIONS.? Даже я сталкиваюсь с аналогичной проблемой, мой сервер caldav работает с macOS, но в iOS после запроса параметров он говорит, что проверка учетной записи CalDAV не удалась. - person SGuru; 20.12.2017