Соблюдение правовых норм GDPR и CCPA с помощью АPI

Законы о защите данных

В данном руководстве представлена информация по внедрению AppsFlyer OpenGDPR API. АPI позволяют владельцам приложений соблюдать законы о защите персональных данных, такие как CCPA и GDPR. 

Примечание юриста: Информация в данном руководстве не может считаться рекомендациями юриста. Информация предоставляется только для ознакомления. Вам необходимо обратиться к юристам и другим профессиональным консультантам, чтобы определить, насколько и как именно к вам применимы GDPR, CCPA и любые другие законы о защите данных.  Уровень конфиденциальности ваших данных в AppsFlyer определяется Политикой конфиденциальности AppsFlyer.   

В данной статье под законами о защите данных понимаются (но не ограничиваются ими):

  • GDPR: General Data Protection Regulation — общий регламент по защите данных; это регламент Европейского союза по правилам обработки персональных данных граждан ЕС
  • CCPA: California Consumer Privacy Act — закон о защите персональных данных граждан штата Калифорния 

Термины "законы о защите данных", "GDPR" и "CCPA" в данной статье употребляются как взаимозаменяемые. 

Инициатива OpenGDPR

Для управления запросами субъектов данных в соответствии с требованиями законов о защите данных, AppsFlyer совместно с компаниями mParticle, Amplitude и Braze запустил протокол OpenGDPR.

OpenGDPR — это унифицированная среда с открытой структурой, обеспечивающая сотрудничество между компаниями-разработчиками для обеспечения справедливого и прозрачного использования данных клиентов. Эта инициатива позволяет разработчикам без труда реализовывать меры по защите данных клиентов в разных системах при их обработке и хранении.

Подробнее об этой инициативе см. здесь.

Определения

Термин GDPR Термин AppsFlyer Описание
Субъект данных Пользователь приложения или конечный пользователь Пользователь приложения, о ком собираются данные
Контролер данных Владелец приложения или рекламодатель Владелец приложения определяет цели и способы обработки персональных данных. 
Обработчик данных AppsFlyer и его партнеры AppsFlyer и его партнеры, которые обрабатывают персональные данные по поручению контролера данных.

Требования GDPR

В GDPR изложены обязательные права субъекта данных, которые должен соблюдать контролер данных. В целях использования АPI эти права превращаются в запросы различных типов. Ниже показано, как AppsFlyer обрабатывает различные типы запросов. 

Тип запроса

(право)

Определение в GDPR

Обработка запроса в AppsFlyer 

Доступ к данным

  • Пользователи приложения имеют право знать, будет ли владелец приложения обрабатывать их данные, с какой целью и в течение какого срока.
  • Если данные предоставляются третьим лицам, например, AppsFlyer, пользователи приложения имеют право знать, кто эти третьи лица.
  • Право на получение сведений об обрабатываемых категориях данных.
  • Право на получение сведений о наличии автоматических средств обработки, которые могут оказать существенное воздействие на данные.
Владельцы приложения получают копию обработанных персональных данных пользователя приложения.

 Переносимость данных

Все персональные данные должны предоставляться пользователю приложения в структурированном, общепринятом и машиночитаемом формате, например в виде СSV-файла.

Владельцы приложения получают копию обработанных персональных данных пользователя приложения.

Исправление данных

Позволяет пользователям приложения вносить исправления в свои данные в случае их неточности или недостоверности. Владельцы приложения должны удалить или исправить неточные или неполные данные.

  • AppsFlyer удаляет данные пользователя приложения, записанные до даты запроса на исправление.
  • AppsFlyer регистрирует данные, полученные после запроса.

Удаление данных

Право на удаление данных обязывает владельцев приложения удалить персональные данные пользователя в течение одного месяца после получения запроса.

Данные удалены.

API AppsFlyer для запросов GDPR

AppsFlyer обеспечивает выполнение описанных выше требований GDPR с помощью API для запросов

  1. Запрос GDPR: выполнение запроса одного из вышеперечисленных типов: "доступ к данным", "переносимость данных", "удаление данных" или "исправление данных".
  2. Запрос состояния — получение информации о текущем состоянии запроса GDPR.
  3. Запрос на обнаружение — получение информации о поддерживаемой версии API и формате данных.
  4. Отмена: Отмените запрос GDPR на этапе pending (в ожидании).

Владельцы приложений обязаны внести изменения в графический интерфейс приложения, чтобы пользователи приложения имели возможность отправлять такие запросы. Обратите внимание, что запросы GDPR рассматриваются по отдельным пользователям.

1. Запрос GDPR

Процедура выполнения запросов GDPR

Процедура выполнения запросов GDPR всех типов (доступ к данным, переносимость данных, удаление или исправление данных) одинакова:

  1. Пользователь приложения отправляет запрос.
  2. Владелец приложения создает запрос GDPR (см. ниже) и отправляет его в AppsFlyer.
  3. AppsFlyer получает запрос и, если запрос правильный, отправляет ответ "201 OK".
  4. Запрос помещается в очередь и в течение следующих 48 часов имеет статус pending (в ожидании). На этом этапе пользователь приложения может отменить запрос. 
  5. Через 48 часов статус запроса меняется на in_progress (выполняется). AppsFlyer отправляет постбэк "status change" (изменение статуса). Запрос уже нельзя отменить. 
  6. a) AppsFlyer выполняет запрос в течение 28 дней.
    Если пользователь приложения запросил удаление или исправление данных, его данные удаляются.
    Если поступил запрос на переносимость данных или доступ к данным, то доступ к данным пользователя приложения можно осуществить на панели управления AppsFlyer в разделе GDPR или с помощью запросов к API (см.ниже).
    b) Статус запроса меняется на completed (выполнено).  AppsFlyer отправляет постбэк "status change" (изменение статуса) .

Формат запроса GDPR

В API GDPR для отправки запросов используется HTTP-команда POST в конечную точку: 

https://hq1.appsflyer.com/gdpr/opengdpr_requests?api_token=[api token]

Токен API — это тот же токен API, который используется для Pull API. Администратор получает токен Pull API на странице токен API на панели управления.  

Параметры
Имя свойства Обязательно/Не обязательно Описание
subject_request_id Да Строка UUID v4. Создается контролером при отправке запроса обработчику. Затем ее можно использоваться для проверки состояния, обновления или отмены запроса.
subject_request_type Да

Строковое значение, определяющее тип запроса GDPR. Допустимые значения:

  • erasure
  • portability
  • access
  • rectification
subject_identities Да
  • Массив объектов-идентификаторов, определяющих идентификатор инициатора запроса (см. ниже).
  • Каждый запрос может содержать только один идентификатор инициатора запроса.
submitted_time Да
  • Строка даты в формате RFC 3339, определяющая время создания исходного запроса субъектом данных
  • Метки времени по UTC
property_id Да

Строка, определяющая мобильное приложение, к которому относится этот запрос

Пример:

  • iOS: id123456789
  • Приложения на Android: com.example, com.publishers.name 
  • Внемагазинные приложения на Android: com.publisher.name-channel
    Примечание В некоторых случаях владельцы приложений регистрируют атрибуцию внемагазинных приложений, используя имя Google Play для Android. В таких случаях используйте обычное название приложения, как оно указано на панели управления.
api_version Нет Строка версии, определяющая нужную версию API запросов GDPR.
status_callback_urls Да
  • Массив конечных точек для обратных вызовов c состоянием, которые передаются для изменения состояния запроса.
  • Поддерживаются только конечные точки https.
Объекты Subject_identities
Тип объекта Обязательно/Не обязательно Описание
identity_type Да
  • Тип идентификатора в строковом формате:
    • ios_advertising_id
    • android_advertising_id
    • fire_advertising_id
    • microsoft_advertising_id
  • Пример: "android_advertising_id"
identity_value Да
  • Формат: строка
  • Пример: "a7551968-d5d6-44b2-9831-815ac9017798"
identity_format Да
  • Метод кодирования identity_value: допустим только raw:
  • Пример: "raw"

Пример запроса GDPR на удаление данных 

HTTP POST 
https://hq1.appsflyer.com/gdpr/opengdpr_requests?api_token={api token] 
HTTP/1.1Host: example.processo.com
Accept: application/json
Content-Type: application/json
{ 
 "subject_request_id":"a7551968-d5d6-44b2-9831-815ac9017798",
 "subject_request_type":"erasure",
 "submitted_time":"2018-10-02T15:00:00Z",
 "subject_identities":[ 
  { 
   "identity_type":"android_advertising_id",
   "identity_value":"a55684fd-j661-46df-9149-f7bfd652egge",
   "identity_format":"raw"
  }
 ],
 "api_version":"0.1",
 "property_id":"com.example",
 "status_callback_urls":[ 
  "https://examplecontroller.com/opengdpr_callbacks"
 ]
}
 

 

Пример кода запроса GDPR типа "удаление"

JavaPythonNode.jsC#
/* 
using the okhttp package install from maven
https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp
 */

import okhttp3.*;
import java.io.IOException;

public class GdprSendRequest {
 public static void main(String[] args){

  OkHttpClient client = new OkHttpClient();
  RequestBody body = RequestBody.create(null, "" +
  "{\r\n\"subject_request_id\": \"<SUBJECT_ID>\"," +
  "\r\n\"subject_request_type\": \"erasure\"," +
  "\r\n\"submitted_time\": \"2018-11-02T15:00:00Z\"," +
  "\r\n\"subject_identities\": [\r\n" +
  "{\r\n\"identity_type\": \"android_advertising_id\"," +
  "\r\n\"identity_value\": \"<ADVERTISING_ID>\"," +
  "\r\n\"identity_format\": \"raw\"\r\n}" +
   "\r\n]," +
   "\r\n\"property_id\": \"com.example.application\"}");

  Request request = new Request.Builder()
  .url("https://hq1.appsflyer.com/gdpr/opengdpr_requests?api_token=<API_TOKEN>")
  .post(body)
  .addHeader("Content-Type", "application/json")
   .addHeader("Accept", "application/json")
  .build();

  try {
   Response response = client.newCall(request).execute();
   System.out.println(response.code());
   System.out.println(response.body().string());
   System.exit(0);
  } catch (IOException e) {
   e.printStackTrace();
   System.exit(1);
  }
 }
}

2. Запрос состояния

Для каждого отправленного запроса GDPR можно впоследствии отправить запрос о его состоянии, указав параметр subject_request_id. Возможны четыре варианта состояния:

  1. pending (Ожидание) — получен правильный запрос, который в данное время находится в очереди.
  2. in_progress (Выполняется) — запрос в данное время находится в обработке.
  3. completed (Выполнен) — запрос выполнен.
  4. cancelled (Отменен) — запрос отменен.

Формат запроса состояния

Для отправки запросов состояния используется HTTP-команда GET в следующую конечную точку:

https://hq1.appsflyer.com/gdpr/opengdpr_requests/[subject_request_id]?api_token=[api token]

Пример ответа на запрос состояния

HTTP/1.1 200 OK
Content-Type: application/json
X-OpenGDPR-Processor Domain: example processor.com
X-OpenGDPR-Signature:
kiGlog3PdQx+FQmB8wYwFC1fekbJG7Dm9WdqgmXc9uKkFRSM4uPzylLi7j083461xLZ+mUloo3tpsmyIZpt5eMfgo7ejXPh6lqB4ZgCnN6+1b6Q3NoNcn/+11UOrvmDj772wvg6uIAFzsSVSjMQxRs8LAmHqFO4cF2pbuoPuK2diHOixxLj6+t97q0nZM7u3wmgkwF9EHIo3C6G1SI04/odvyY/VdMZgj3H1fLnz+X5rc42/wU4974u3iBrKgUnv0fcB4YB+L6Q3GsMbmYzuAbe0HpVA17ud/bVoyQZAkrW2yoSy1x4Ts6XKba6pLifIHf446Bubsf5r7x1kg6Eo7B8zur666NyWOYrglkOzU4IYO8ifJFRZZXazOgk7ggn9obEd78GBc3kjKKZdwaCrLx7WV5y9TMDCf+2FILOJM/MwTUy1dLZiaFHhGdzld2AjbjK1CfVzyPssch0iQYYtbR49GhumvkYl11S4oDfu0c3t/xUCZWg0hoR3XL3B7NjcrlrQinB1KbyTNZccKR0F4Lk9fDgwTVkrAg152UqPyzXxpdzXjfkDkSEgAevXQwVJWBNf18bMIEgdH2usF/XauQoyrne7rcMIWBISPgtBPj3mhcrwscjGVsxqJva8KCVCKD/4Axmo9DISib5/7A6uczJxQG2Bcrdj++vQqK2succ=
{
 "controller_id":"example_controller_id",
 "expected_completion_time":"2018-11-01T15:00:01Z",
 "subject_request_id":"a7551968-d5d6-44b2-9831-815ac9017798",
 "request_status":"pending",
 "api_version":"0.1"
}

Постбэки состояния

Как описано выше в разделе Процедура выполнения запросов GDPR, при изменении состояния запроса GDPR с pending на in_progress и на completed AppsFlyer отправляет постбэк GDPR в запрашивающие конечные точки, которые указаны в свойстве status_callback_urls.

Пример постбэка состояния:

POST /opengdpr_callbacks HTTP/1.1
Host: examplecontroller.com
Content-Type: application/json
X-OpenGDPR-Processor Domain: appsflyer.com
X-OpenGDPR-Signature: kiGlog3PdQx+FQmB8wYwFC1fekbJG7Dm9WdqgmXc9uKkFRSM4uPzylLi7j083461xLZ+mUloo3tpsmyIZpt5eMfgo7ejXPh6lqB4ZgCnN6+1b6Q3NoNcn/+11UOrvmDj772wvg6uIAFzsSVSjMQxRs8LAmHqFO4cF2pbuoPuK2diHOixxLj6+t97q0nZM7u3wmgkwF9EHIo3C6G1SI04/odvyY/VdMZgj3H1fLnz+X5rc42/wU4974u3iBrKgUnv0fcB4YB+L6Q3GsMbmYzuAbe0HpVA17ud/bVoyQZAkrW2yoSy1x4Ts6XKba6pLifIHf446Bubsf5r7x1kg6Eo7B8zur666NyWOYrglkOzU4IYO8ifJFRZZXazOgk7ggn9obEd78GBc3kjKKZdwaCrLx7WV5y9TMDCf+2FILOJM/MwTUy1dLZiaFHhGdzld2AjbjK1CfVzyPssch0iQYYtbR49GhumvkYl11S4oDfu0c3t/xUCZWg0hoR3XL3B7NjcrlrQinB1KbyTNZccKR0F4Lk9fDgwTVkrAg152UqPyzXxpdzXjfkDkSEgAevXQwVJWBNf18bMIEgdH2usF/XauQoyrne7rcMIWBISPgtBPj3mhcrwscjGVsxqJva8KCVCKD/4Axmo9DISib5/7A6uczJxQG2Bcrdj++vQqK2succ=

{
"controller_id":"example controller id at the processor",
"expected_completion_time":"2018-11-01T15:00:01Z",
"status_callback_url":"https://examplecontroller.com/opengdpr_callbacks",
"Subject_request_id":"a7551968-d5d6-44b2-9831-815ac9017798",
"Request_status":"pending"
}

3. Отчет по запросу

После выполнения запроса типа "доступ" или "переносимость" можно с помощью HTTP-команды GET загрузить отчет в следующую конечную точку:

https://hq1.appsflyer.com/gdpr/download/[REQUEST_ID]?api_token=[TOKEN]

Сформированный отчет доступен в течение семи дней .

4. Запрос на обнаружение

Для получения сведений о форматах, которые поддерживает AppsFlyer, можно отправить запрос на обнаружение с помощью HTTP-команды GET в следующую конечную точку:

https://hq1.appsflyer.com/gdpr/discovery?api_token=[api token]

Пример ответа на запрос на обнаружение

HTTP/1.1 200 OK
Content-Type: application/json
{
 "api_version": "0.1",
 "supported_identities": [
 {
  "identity_type": "android_advertising_id",
  "identity_format": "raw"
 },
 ],
 "supported_subject_request_types": [
 "erasure", "access", "portability", "rectification"
 ],
 "processor_certificate": "https://exampleprocessor.com/cert.pem"
}

5. Запрос на отмену

Запрос GDPR можно отменить, указав его параметр subject_request_id, однако это возможно только на этапе pending (ожидание). 

Для этого отправьте HTTP-команду DELETE с параметром subject_request_id в конечную точку:

https://hq1.appsflyer.com/gdpr/opengdpr_requests/[subject_request_id]?api_token=[api token]

Ответ на запрос на отмену

При получении запроса на отмену AppsFlyer возвращает HTTP-ответ с кодом состояния 202 и ряд других параметров. Подробные сведения см. в спецификации GDPR, пункт "Свойства ответа на запрос об отмене".

После отмены запроса AppsFlyer отправляет постбэк с состоянием cancelled (Отменен). 

6. Тестовый API запросов GDPR

Этот API AppsFlyer представляет собой тестовый API запросов GDPR. 

Схема работы

Тестовый API работает следующим образом:

1. Сразу после получения запроса GDPR он переводится в состояние "Pending" (ожидание). Для целей тестирования состояние меняется каждые 30 секунд.

2. Если запрос GDPR содержит конечную точку для постбэка состояния, первый постбэк отправляется сразу же после получения запроса, а затем отправляются еще два постбэка состояния с интервалом 30 секунд.

Конечная точка тестирования запросов GDPR:

https://hq1.appsflyer.com/gdpr/stub?api_token=[api token]

Конечная точка тестирования запросов состояния:

https://hq1.appsflyer.com/gdpr/stub/[request id]?api_token=[api token]

Конечная точка тестирования запросов на обнаружение:

https://hq1.appsflyer.com/gdpr/stub/discovery?api_token=[api token]

Конечная точка тестирования запроса на отмену:

https://hq1.appsflyer.com/gdpr/stub/[request id]?api_token=[api token]

 Примечания.

  • Запрос должен содержать действительный токен API.
  • Идентификатор приложения, указанный в свойстве "property_id", должен принадлежать владельцу аккаунта (в соответствии с токеном API).

Журналы запросов

Все отправленные запросы GDPR можно просматривать в разделе журналов панели управления, однако эта возможность доступна только владельцам аккаунтов.

Кроме того, на этой панели управления можно загрузить отчет о выполненных запросах типа "доступ" и "переносимость".

Доступ к разделу журналов на панели управления:

  1. Откройте главную страницу панели управления и нажмите на свое имя пользователя.
  2. Выберите Logs, после чего откроется показанное ниже окно:

GDPR_Table.png

Ограничения

  • Учетная запись клиента может посылать до 80 запросов GDPR каждые две минуты.

 

Была ли эта статья полезной?