GDPR

  • Рекламодатели
  • агентства
  • Рекламные сети
  • Разработчики

Соблюдение правовых норм GDPR

Общий регламент по защите данных (General Data Protection Regulation, GDPR) — это норма европейского законодательства в отношении защиты и конфиденциальности персональных данных граждан Евросоюза. В нем установлено, что компании, которые используют персональные данные физических лиц, обязаны удовлетворять их запросы на доступ, переносимость, исправление и удаление данных в срок до 1 месяца

При мобильной атрибуции невозможно заранее определить, кто из пользователей является гражданином ЕС, поэтому GDPR применяется ко всем пользователям мобильных устройств, независимо от их гражданства.

Инициатива GDPR

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

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

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

Субъекты GDPR

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

Требования GDPR

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

Права

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

Как AppsFlyer помогает контролеру

Право на доступ

  1. Субъекты данных имеют право требовать от контролера сведения о том, будут ли обрабатываться их данные, с какой целью и в течение какого срока.
  2. Если данные предоставляются третьим лицам (например, AppsFlyer), субъекты данных имеют право знать, кто эти третьи лица.
  3. Право на получение сведений об обрабатываемых категориях данных.
  4. Право на получение сведений о наличии автоматических средств обработки, которые могут оказать существенное воздействие на данные.
При отправке запроса типа "доступ" контролеры получают копию обработанных персональных данных субъекта данных.

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

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

При отправке запроса типа "переносимость" контролеры данных получают копию обработанных персональных данных субъекта данных.

Право на исправление

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

Когда контролер данных отправляет запрос типа "исправление", AppsFlyer удаляет старые данные субъекта данных и заменяет их новыми.

Право на удаление

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

Рекламодатели могут удалять собранные персональные данные субъектов данных по запросу на удаление.

GDPR_logo2.png

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

AppsFlyer обеспечивает выполнение описанных выше требований с помощью API для запросов GDPR (начиная с 25 мая 2018 г.; запросы, полученные до этой даты, не обрабатываются).

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

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

1. Запрос GDPR

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

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

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

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

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

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

со следующими свойствами: 

Имя свойства Обязательное / Необязательное Описание
subject_request_id ОБЯЗАТЕЛЬНОЕ Строка UUID v4. Создается контролером при отправке запроса обработчику.
subject_request_type ОБЯЗАТЕЛЬНОЕ Строковое значение, определяющее тип запроса GDPR. Допустимые значения: "erasure" (удаление), "portability" (переносимость), "access" (доступ) и "rectification" (исправление).
subject_identities ОБЯЗАТЕЛЬНОЕ Массив объектов-идентификаторов, содержащий тип, значение и формат идентификатора устройства (см. ниже).  Каждый запрос может содержать только один идентификатор устройства.
submitted_time ОБЯЗАТЕЛЬНОЕ Строка даты в формате RFC 3339, определяющая время создания субъектом данных исходного запроса. Обратите внимание, что все временные метки передаются в формате UTC.
property_id ОБЯЗАТЕЛЬНОЕ Строка, определяющая мобильное приложение, к которому относится этот запрос, например com.example для Android, id123456789 для iOS
api_version НЕОБЯЗАТЕЛЬНОЕ Строка версии, определяющая нужную версию API запросов GDPR.
status_callback_urls  НЕОБЯЗАТЕЛЬНОЕ Массив конечных точек для обратных вызовов c состоянием, которые передаются для изменения состояния запроса. Обратите внимание, что поддерживаются ТОЛЬКО конечные точки HTTPS.

Запрос GDPR ДОЛЖЕН содержать один или несколько объектов-идентификаторов, используемых для выполнения запроса. 

  1. identity_type — ОБЯЗАТЕЛЬНОЕ строковое значение, определяющее форму идентификатора. В AppsFlyer допускаются такие типы идентификаторов: ios_advertising_id, android_advertising_id, fire_advertising_id и microsoft_advertising_id. 
  2. identity_value — ОБЯЗАТЕЛЬНОЕ строковое значение, определяющее идентификатор.
  3. identity_format — ОБЯЗАТЕЛЬНОЕ строковое значение, определяющее кодировку идентификатора. В данное время AppsFlyer поддерживает для идентификаторов только формат 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 типа "удаление"

Java Python Node.js C#
/* 
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

 

Была ли эта статья полезной?
Пользователи, считающие этот материал полезным: 1 из 2