Вы можете просматривать свои контакты и управлять ими с помощью протокола Google CardDAV.
Контакты хранятся в учетной записи Google пользователя; большинство сервисов Google имеют доступ к списку контактов. Ваше клиентское приложение может использовать API CardDAV для создания новых контактов, редактирования или удаления существующих контактов, а также запроса контактов, соответствующих определенным критериям.
Технические характеристики
Полная спецификация не реализована, но многие клиенты, такие как Apple iOS™ Contacts и macOS, должны корректно взаимодействовать.
Для каждой соответствующей спецификации поддержка CardDAV от Google выглядит следующим образом:
- 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.
- Главный
-
userEmail
-
- Домашний набор
- https://www.googleapis.com/carddav/v1/principals/userEmail /
userEmail
- https://www.googleapis.com/carddav/v1/principals/userEmail /
- Адресная книга
- https://www.googleapis.com/carddav/v1/principals/userEmail
userEmail
lists/default
- https://www.googleapis.com/carddav/v1/principals/userEmail
- Контакт
- https://www.googleapis.com/carddav/v1/principals/userEmail
userEmail
lists/default/contactId
- https://www.googleapis.com/carddav/v1/principals/userEmail
Синхронизация контактов
Ниже приводится общее описание поддерживаемых операций. Подробности разработчикам следует искать в соответствующем RFC. Запросы и ответы в основном кодируются в XML. Вот основные операции, используемые клиентскими приложениями для синхронизации:
- Использование CTag
- Клиентские программы используют запрос
getctag
PROPFIND
к ресурсу адресной книги, чтобы определить, изменился ли какой-либо контакт на сервере и, следовательно, необходима ли синхронизация. Значение этого свойства гарантированно изменится при изменении любого контакта. Клиентские приложения должны хранить это значение и использовать его только при начальной синхронизации и в качестве резервного варианта, когдаsync-token
становится недействительным. Периодический опрос свойстваgetctag
приведет к регулированию.
- Клиентские программы используют запрос
- Использование токена синхронизации
- Клиентские программы используют запрос
sync-token
PROPFIND
в адресной книге для получения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 контакта.
- Клиентские приложения удаляют контакт, отправляя запрос