Conformité aux RGPD et CCPA lors de l'utilisation des API

En bref : cet article est destiné aux clients AppsFlyer (propriétaires d'app) qui utilisent la plate-forme AppsFlyer pour attribuer les données utilisateur de l'app. Les propriétaires d'apps mettent en œuvre l'API OpenGDPR pour se conformer aux lois applicables en matière de protection des données telles que le CCPA et le GDPR.

Un message de nos avocats : rien de ce qui est énoncé ici n'a valeur de conseil juridique. Les éléments ne sont fournis qu'à titre d'information. Vous devez travailler en étroite collaboration avec des conseillers juridiques, ou autres, pour déterminer avec précision comment le RGPD, l'ACCP ou toute autre loi peut éventuellement s'appliquer à votre cas.La relation de confidentialité qui existe entre AppsFlyer et vous est régie par la politique de confidentialité des services AppsFlyer   

Politiques de confidentialité

Dans cet article, les références aux règles de confidentialité incluent :

  • Le RGPD : le Règlement Général sur la Protection des Données est une réglementation de l'UE relative à la protection des données et à la vie privée des citoyens de l'Union européenne
  • Le CCPA : California Consumer Privacy Act

Les termes des règlements de confidentialité, GDPR et CCPA, sont chacun utilisés d'une manière indistincte dans cet article.

L'initiative RGPD

Pour traiter les demandes des personnes sujettes des données, conformément aux règles de confidentialité, AppsFlyer, en collaboration avec mParticle, Amplitude et Braze, ont lancé le protocole OpenGDPR.

OpenGDPR est un cadre unifié et open-source, facilitant la coopération entre les entreprises technologiques pour l'utilisation équitable et transparente des données des consommateurs. Il permet aux fournisseurs de prendre des mesures de confidentialité des données sur systèmes multiples pour traiter et stocker les données client.

Pour en savoir plus sur cette initiative, cliquez ici.

Définitions

Termes RGPD Termes Appsflyer Description
Personne concernée Utilisateur d'app ou utilisateur final L'utilisateur d'app dont les données sont collectées
Responsable du traitement des données Propriétaire d'app ou annonceur Le propriétaire d'app détermine le but et les moyens par lesquels les données personnelles sont traitées. 
Processeur de données AppsFlyer et ses partenaires AppsFlyer et ses partenaires traitent les données personnelles au nom du responsable du traitement des données

Exigences du RGPD

Le RGPD détaille les droits obligatoires de la personne sujette des données, que le responsable des données doit respecter. Pour servir l'API, ces droits sont traduits en types de demande. Les informations suivantes expliquent comment AppsFlyer traite les différents types de demande. 

Type de demande

(Droit)

Définition du RGPD

Traitement de la demande par AppsFlyer

Accès

  • S'ils le souhaitent, les utilisateurs d'une app ont le droit de savoir si, pourquoi et pendant combien de temps le propriétaire de l'app traitera leurs données.
  • Si les données sont partagées avec des tiers, comme AppsFlyer, les utilisateurs d'une app ont le droit de savoir qui sont ces tiers.
  • Le droit de savoir quelles catégories de données sont traitées.
  • En cas de traitement automatisé, si ce dernier a un effet significatif sur celles-ci.
Les propriétaires de l'app reçoivent une copie du traitement des données personnelles de l'utilisateur de l'app.

 Portabilité

L'utilisateur de l'app doit recevoir toutes ses données personnelles sous un format structuré, communément utilisé et lisible par une machine, comme un fichier CSV.

Le propriétaire de l'app reçoit une copie du traitement des données personnelles de l'utilisateur de l'app.

Rectification

Permet aux utilisateurs d'app de corriger leurs données s'ils voient qu'elles sont inexactes ou erronées. Les propriétaires d'app ont le devoir d'effacer ou corriger les données inexactes ou incomplètes.

  • AppsFlyer supprime les données de l'utilisateur de l'app qui ont enregistrées avant la date de la demande de rectification.
  • Les données qui sont reçues après cette date sont enregistrées par AppsFlyer.

Effacement

Le droit à l'effacement oblige les propriétaires d'app à supprimer toutes les données personnelles dans un délai d'un mois après réception de la demande.

Les données sont effacées

API de demande RGPD d'AppsFlyer

La conformité aux exigences du RGPD décrites dans ce document est obtenue à l'aide de l'API de demande RGPD d'AppsFlyer

  1. Demande RGPD - Effectuer l'un des types de demande ci-dessus: accès, portabilité, effacement, rectification.
  2. Demande d'état - Interroger l'état actuel d'une demande RGPD
  3. Demande de découverte : Se renseigner sur la version de l'API et le format de données pris en charge
  4. Annulation : annuler une demande RGPD pendant sa phase traitement en cours.

Les propriétaires d'app doivent apporter des modifications dans l'IU dans leur application afin que les utilisateurs de l'app puissent soumettre des demandes. Notez que les demandes RGPD concernent un utilisateur à la fois.

1. Demande RGPD

Flux de demande RGPD

Les types de demande RGPD, que ce soit l'accès, la portabilité, l'effacement ou la rectification, suivent la même procédure :

  1. Un utilisateur de l'app soumet une demande.
  2. Le propriétaire de l'app élabore la demande RGPD (voir ci-dessous) puis l'envoie à AppsFlyer.
  3. AppsFlyer reçoit la demande et répond par un "201 OK" pour les demandes valides.
  4. Durant les 48 heures suivantes, la demande est mise dans la file d'attente, son état est pending. L'utilisateur de l'app peut encore annuler la demande.
  5. Les 48 heures écoulées, l'état de la demande passe à in_progress.AppsFlyer envoie un postback 'changement de status'. La demande ne peut plus être annulée. 
  6. a) En 28 jours maximum, AppsFlyer accède à la demande.
    Dans le cas d'un effacement ou d'une rectification, les données de l'utilisateur de l'app sont supprimées.
    Dans le cas d'une portabilité ou d'un accès, les données de l'utilisateur de l'app sont accessibles dans la section GDPR du tableau de bord AppsFlyer, ou bien via l'API Request (voir ci-dessous).
    b) Le statut de la demande passe à completed.AppsFlyer envoie un postback de modification de statut.

Format de la demande RGPD

Une API de demande RGPD peut être envoyée via HTTP POST au point de terminaison suivant - 

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

Le jeton d'API est le même jeton d'API utilisé pour l'API Pull. L'administrateur récupère le jeton d'API Pull depuis la page du jeton d'API du tableau de bord.

Paramètres
Nom de la propriété Obligatoire Description
subject_request_id Oui Chaîne UUID v4. Générée par le responsable du traitement au moment de la soumission de la demande à un processeur. Elle peut ensuite être utilisée pour vérifier l'état de la demande, la mettre à jour ou l'annuler.
subject_request_type Oui

Valeur de chaîne représentant le type de demande RGPD.  Valeurs prises en charge :

  • erasure
  • portability
  • access
  • rectification
subject_identities Oui
  • Un ensemble de d'éléments d'identification permettant de définir l'identité du demandeur (voir ci-dessous).
  • Chaque demande peut contenir une seule identité.
submitted_time Oui
  • Chaîne de date RFC 3339 indiquant l'heure de la demande d'origine par la personne sujette.
  • Horodateurs en UTC
property_id Oui

Chaîne représentant l'application mobile à laquelle cette�demande est étendue

Exemples :

  • iOS : id123456789
  • Android : com.example, com.publishers.name
  • Android hors store : com.publisher.name-channel
    Remarque Dans certains cas, les propriétaires d'app enregistrent l'attribution hors store à l'aide du nom Android Google Play. Le cas échéant, utilisez le nom habituel de l'app, tel qu'il s'affiche dans le tableau de bord.
api_version Non Chaîne de version représentant la version souhaitée de l'API de demandes RGPD
status_callback_urls Oui
  • Tableau de points de terminaison pour les callbacks d'état à envoyer aux changements d'état de demande suivants.
  • Seuls les points de terminaison https sont pris en charge.
Éléments Subject_identities
Type d'élément Obligatoire Description
identity_type Oui
  • Le type d'identité au format chaîne :
    • ios_advertising_id
    • android_advertising_id
    • fire_advertising_id
    • microsoft_advertising_id
    • appsflyer_id
  • Exemple : "android_advertising_id "
identity_value Oui
  • Format : chaîne
  • Exemple : "a7551968-d5d6-44b2-9831-815ac9017798"
identity_format Oui
  • La méthode utilisée pour encoder identity_value : raw est la seule prise en charge :
  • Example : "raw"

Exemple de demande d'effacement RGPD

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"
 ]
}
 

 

Exemple de code de demande RGPD d'effacement

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. État de la demande

Chaque demande RGPD peut être interrogée ultérieurement pour connaître son état, en spécifiant le subject_request_id. Il existe 4 types d'état pris en charge :

  1. pending - Une demande correcte a été reçue et est actuellement en file d'attente
  2. in_progress - Une demande est actuellement en cours d'exécution
  3. completed - Une demande a été satisfaite
  4. cancelled - Une demande a été annulée

Format de l'état de la demande

Une demande d'état peut être envoyée via HTTP GET au point de terminaison suivant :

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

Exemple de réponse concernant l'état

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"
}

Postbacks de l'état

Tel que décrit dans la section Flux de demande RGPD ci-dessus, lorsque l'état de la demande RGPD passe de pending à in_progress à completed, AppsFlyer envoi un postback RGPD aux points de terminaisons demandeurs, spécifiée avec la propriété status_callback_urls .

Exemple de postback d'état :

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. Demande de rapport

Une fois qu'une demande d'accès ou une demande de portabilité a été effectuée, vous pouvez télécharger le rapport via HTTP GET au point de terminaison suivant :

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

Le rapport généré est disponible pendant sept jours à compter de la date d'achèvement.

4. Demande de découverte

Pour en savoir plus sur les formats pris en charge par AppsFlyer, une demande de découverte peut être soumise via HTTP GET au point de terminaison suivant :

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

Exemple de réponse à une demande de découverte

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. Demande d'annulation

Il est possible d'annuler une demande RGPD selon son subject_request_id, mais uniquement pendant la phase pending

Pour ce faire, envoyez un HTTP DELETE avec subject_request_id à :

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

Réponse à une demande d'annulation

Lors de la réception d'une demande d'annulation RGPD, AppsFlyer renvoie une réponse HTTP avec le code d'état 202 et plusieurs autres paramètres. Pour plus de détails, réferez-vous au chapitre « Propriétés d'une réponse à une demande d'annulation » du RGPD.

Une fois l'annulation de la demande effectuée, AppsFlyer envoie un postback avec l'état cancelled

6. API de test des demandes RGPD

Cette API AppsFlyer est une API test pour l'API des demandes RGPD d'AppsFlyer. 

Comment fonctionne l'API de test ?

L'API de test fonctionne comme suit :

1. Une fois qu'une demande RGPD a été effectuée, celle-ci passe immédiatement à l'état « Pending ». À des fins de test, l'état change toutes les 30 secondes.

2. Si un point de terminaison pour un postback d'état a été inséré dans la demande RGPD, un premier postback est envoyé directement après la demande, et deux autres postbacks d'état sont envoyées par intervalles de 30 secondes.

Point de terminaison du test de demande RGPD :

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

Point de terminaison du test de demande d'état :

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

Point de terminaison du test de demande de découverte :

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

Point de terminaison du test de demande d'annulation :

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

 Remarques

  • Un token d'API valide doit être inséré avec la demande.
  • Dans la propriété « property_id », l'ID de l'app doit appartenir au propriétaire du compte (en fonction du token de l'API).

Demande de Logs

Toutes les demandes RGPD soumises peuvent être consultées uniquement par les propriétaires du compte dans le tableau de bord Logs.

Pour les demandes d'accès et de portabilité terminées, il est également possible de télécharger le rapport depuis ce tableau de bord.

Pour accéder au tableau de bord Logs :

  1. Rendez-vous sur le tableau de bord principal et cliquez sur votre nom d'utilisateur.
  2. Cliquez sur Logs pour ouvrir la fenêtre suivante :

GDPR_Table.png

Limites

  • Les comptes clients peuvent envoyer jusqu'à 80 demandes GDPR toutes les 2 minutes.

 

Cet article vous a-t-il été utile ?