Вы можете просматривать и управлять своими контактами с помощью протокола Google CardDAV.
Контакты хранятся в учетной записи Google пользователя; большинство сервисов Google имеют доступ к списку контактов. Ваше клиентское приложение может использовать CardDAV API для создания новых контактов, редактирования или удаления существующих контактов и запроса контактов, соответствующих определенным критериям.
Характеристики
Полная спецификация не реализована, но многие клиенты, такие как Apple iOS™ Contacts и macOS, должны корректно взаимодействовать.
Для каждой соответствующей спецификации поддержка Google CardDAV выглядит следующим образом:
- rfc2518: HTTP-расширения для распределенной разработки (WebDAV)
- Поддерживает HTTP-методы
GET
,PUT
,DELETE
,OPTIONS
иPROPFIND
. - Не поддерживает методы HTTP
LOCK
,UNLOCK
,COPY
,MOVE
илиMKCOL
. - Не поддерживает произвольные (определяемые пользователем) свойства WebDAV.
- Не поддерживает контроль доступа WebDAV (rfc3744).
- Поддерживает HTTP-методы
- rfc5995: Использование POST для добавления участников в коллекции WebDAV
- Поддерживает создание новых контактов без указания идентификатора.
- rfc6352: CardDAV: расширения vCard для распределенной разработки и управления версиями через Интернет (WebDAV)
- Поддерживает HTTP-метод
REPORT
, но не все определенные отчеты реализованы. - Поддерживает предоставление основной коллекции и коллекции контактов.
- Поддерживает HTTP-метод
- rfc6578: Синхронизация коллекции для WebDAV
- Клиентские приложения должны перейти в этот режим работы после первоначальной синхронизации.
- rfc6749: структура авторизации OAuth 2.0 и rfc6750: структура авторизации OAuth 2.0: использование токена носителя
- Поддерживает аутентификацию клиентских программ CardDAV с использованием HTTP-аутентификации OAuth 2.0. Google не поддерживает другие методы аутентификации. В целях безопасности контактных данных мы требуем, чтобы соединения CardDAV использовали HTTPS .
- rfc6764: Поиск служб для расширений календаря для WebDAV (CalDAV) и расширений vCard для WebDAV (CardDAV)
- Начальная загрузка URL-адресов CardDAV должна выполняться в соответствии с разделом 6 rfc6764.
- Поддерживает caldav-ctag-02: тег объекта коллекции календаря (CTag) в CalDAV , который является общим для спецификаций CardDAV и CalDAV.
ctag
для контактов похож наETag
ресурса; он меняется, когда что-либо в адресной книге контактов изменилось. Это позволяет клиентской программе быстро определить, что ей не нужно синхронизировать измененные контакты. - Google использует VCard 3.0 в качестве формата кодирования контактов. См.: rfc6350: VCard 3.0 .
Google CardDAV требует OAuth 2.0
Интерфейс Google CardDAV требует OAuth 2.0. Обратитесь к связанной документации ниже для получения информации об использовании OAuth 2.0 для доступа к API Google:
- Использование OAuth 2.0 для доступа к API Google
- Использование OAuth 2.0 для установленных приложений
Подключение к серверу Google CardDAV
Протокол CardDAV позволяет обнаруживать URI адресной книги и контактных ресурсов. Вы не должны жестко кодировать какой-либо URI, поскольку они могут измениться в любое время.
Клиентские приложения должны использовать HTTPS, а для учетной записи пользователя Google должна быть предоставлена аутентификация OAuth 2.0
. Сервер CardDAV не будет аутентифицировать запрос, если он не поступает по HTTPS с аутентификацией OAuth 2.0 учетной записи Google, и ваше приложение не зарегистрировано на DevConsole. Любая попытка подключения по HTTP с обычной аутентификацией или с адресом электронной почты/паролем, не соответствующим учетной записи Google, приводит к получению кода ответа HTTP 401 Unauthorized
.
Чтобы использовать CardDAV, ваша клиентская программа должна сначала подключиться к каноническому пути обнаружения, выполнив HTTP PROPFIND
для:
https://www.googleapis.com/.well-known/carddav
После перенаправления ( HTTP 301
) на ресурс адресной книги ваша клиентская программа может затем выполнить PROPFIND
для него, чтобы обнаружить свойства DAV:current-user-principal
, DAV:principal-URL
и addressbook-home-set
. Затем ваша программа-клиент может обнаружить основную адресную книгу, выполнив PROPFIND
для addressbook-home-set
и выполнив поиск ресурсов addressbook
книги и collection
. Полное описание этого процесса выходит за рамки данного документа. См. rfc6352 для более подробной информации.
Путь перенаправления, возвращенный в ответе HTTP 301
через PROPFIND
по известному URI, не должен постоянно кэшироваться (согласно rfc6764 ). Устройства должны периодически повторять обнаружение общеизвестного URI, чтобы убедиться, что кэшированный путь все еще актуален, и выполнить повторную синхронизацию, если путь когда-либо изменится. Google рекомендует делать это каждые 2-4 недели.
Ресурсы
CardDAV использует концепции REST. Клиентские приложения работают с ресурсами, обозначенными их URI. Текущая структура URI указана здесь, чтобы помочь разработчикам понять концепции, изложенные в следующем разделе. Структура может меняться и не должна быть жестко запрограммирована. Скорее, ресурсы должны быть обнаружены в соответствии с RFC.
- Главный
- https://www.googleapis.com/carddav/v1/principals/
userEmail
- https://www.googleapis.com/carddav/v1/principals/
- Домашний набор
-
userEmail
-
- Адресная книга
-
userEmail
-
- Контакт
- https://www.googleapis.com/carddav/v1/principals/userEmail /lists/
contactId
/userEmail
- https://www.googleapis.com/carddav/v1/principals/userEmail /lists/
Синхронизация контактов
Ниже приведено общее описание поддерживаемых операций. Разработчики должны искать подробности в соответствующем RFC. Запросы и ответы в основном кодируются в XML. Вот основные операции, используемые клиентскими приложениями для синхронизации:
- Использование CTag
- Клиентские программы используют
getctag
PROPFIND
к ресурсу адресной книги, чтобы определить, изменился ли какой-либо контакт на сервере и, следовательно, требуется ли синхронизация. Значение этого свойства гарантированно изменится при изменении любого контакта. Клиентские приложения должны хранить это значение и использовать его только при начальной синхронизации и в качестве запасного варианта, когдаsync-token
становится недействительным. Периодический опрос свойстваgetctag
приведет к регулированию.
- Клиентские программы используют
- Использование токена синхронизации
- Клиентские программы используют запрос
PROPFIND
sync-token
синхронизации в адресной книге для полученияsync-token
представляющего его текущее состояние. Клиентские приложения должны хранить это значение и выдавать периодические запросыREPORT
sync-collection
для определения изменений с момента последнего выпускаsync-token
. Выданные токены действительны в течение 29 дней, а ответREPORT
будет содержать новыйsync-token
.
- Клиентские программы используют запрос
- Использование ETag
- Клиентские приложения выдают
getetag
PROPFIND
к ресурсу адресной книги (с заголовкомDEPTH
, равнымDEPTH_1
). Сохраняя значениеETag
для каждого контакта, клиентская программа может запросить значение контактов, для которых изменилсяETag
.
- Клиентские приложения выдают
- Получение контактов
- Клиентские приложения извлекают контакты, отправляя запрос
REPORT
сaddressbook-multiget
. Учитывая список URI контактов, отчет возвращает все запрошенные контакты в виде значений VCard 3.0. Каждая запись включаетETag
для контакта.
- Клиентские приложения извлекают контакты, отправляя запрос
- Вставка контакта
- Клиентские приложения отправляют запрос
POST
с новым контактом в формате VCard 3.0. Ответ будет содержать идентификатор нового контакта.
- Клиентские приложения отправляют запрос
- Обновление контакта
- Клиентские приложения выдают запрос
PUT
с обновленным контактом в формате VCard 3.0. Контакт обновляется, если контакт уже существует в адресной книге. - Клиентские приложения должны включать заголовок
If-Match
с известным на данный моментETag
. Затем сервер отклонит запросPUT
(сHTTP 412
), если текущийETag
на сервере отличается отETag
, отправленного клиентской программой. Это позволяет оптимистично сериализовать обновления.
- Клиентские приложения выдают запрос
- Удаление контакта
- Клиентские приложения удаляют контакт, отправляя запрос
DELETE
на URI контакта.
- Клиентские приложения удаляют контакт, отправляя запрос