> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Exportation en bloc des données utilisateur

> Exportez les données de profil utilisateur prises en charge d’Auth0 dans un fichier au format compatible avec JSON ou CSV.

export const AuthCodeGroup = ({children, dropdown}) => {
  const [processedChildren, setProcessedChildren] = useState(children);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      unsubscribe = window.autorun(() => {
        const processChildren = node => {
          if (typeof node === "string") {
            let processedNode = node;
            for (const [key, value] of window.rootStore.variableStore.values.entries()) {
              const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
              processedNode = processedNode.replaceAll(new RegExp(escapedKey, "g"), value);
            }
            return processedNode;
          } else if (Array.isArray(node)) {
            return node.map(processChildren);
          } else if (node && node.props && node.props.children) {
            return {
              ...node,
              props: {
                ...node.props,
                children: processChildren(node.props.children)
              }
            };
          }
          return node;
        };
        setProcessedChildren(processChildren(children));
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  return <CodeGroup dropdown={dropdown}>{processedChildren}</CodeGroup>;
};

export const AuthCodeBlock = ({filename, icon, language, highlight, children}) => {
  const [displayText, setDisplayText] = useState(children);
  const [copyText, setCopyText] = useState(children);
  const wrapperRef = React.useRef(null);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      if (!window.autorun || !window.rootStore) {
        return;
      }
      unsubscribe = window.autorun(() => {
        let processedChildrenForDisplay = children;
        let processedChildrenForCopy = children;
        for (const [key, value] of window.rootStore.variableStore.values.entries()) {
          const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
          let displayValue = value;
          if (key === "{yourClientSecret}" && value !== "{yourClientSecret}") {
            displayValue = value.substring(0, 3) + "*****MASQUÉ*****";
          }
          processedChildrenForDisplay = processedChildrenForDisplay.replaceAll(new RegExp(escapedKey, "g"), displayValue);
          processedChildrenForCopy = processedChildrenForCopy.replaceAll(new RegExp(escapedKey, "g"), value);
        }
        setDisplayText(processedChildrenForDisplay);
        setCopyText(processedChildrenForCopy);
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  useEffect(() => {
    if (!wrapperRef.current) return;
    const originalWriteText = navigator.clipboard.writeText.bind(navigator.clipboard);
    let isOverriding = false;
    const handleClick = e => {
      const button = e.target.closest('[data-testid="copy-code-button"]');
      if (!button || !wrapperRef.current.contains(button)) return;
      isOverriding = true;
      navigator.clipboard.writeText = text => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
          return originalWriteText(copyText);
        }
        return originalWriteText(text);
      };
      setTimeout(() => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
        }
      }, 100);
    };
    const wrapper = wrapperRef.current;
    wrapper.addEventListener('click', handleClick, true);
    return () => {
      wrapper.removeEventListener('click', handleClick, true);
      if (navigator.clipboard.writeText !== originalWriteText) {
        navigator.clipboard.writeText = originalWriteText;
      }
    };
  }, [copyText]);
  return <div ref={wrapperRef}>
      <CodeBlock filename={filename} icon={icon} language={language} lines highlight={highlight}>
        {displayText}
      </CodeBlock>
    </div>;
};

Vous pouvez exporter en bloc des données utilisateur depuis Auth0. Pour obtenir la liste des champs de profil utilisateur qui peuvent être exportés, consultez [Structure du profil utilisateur](/docs/fr-ca/manage-users/user-accounts/user-profiles/user-profile-structure).

<div id="supported-file-formats">
  ## Formats de fichiers pris en charge
</div>

Nous prenons en charge les exportations de données utilisateur aux formats compatibles avec JSON et CSV.

* Nos fichiers d’exportation compatibles avec JSON sont au [format NDJSON](https://github.com/ndjson/ndjson-spec) en raison de la grande taille des fichiers d’exportation.

* Dans les fichiers d’exportation CSV, nous échappons les données de type String conformément aux normes de l’OWASP pour atténuer les risques d’injection CSV.

  * Les guillemets doubles sont précédés d’un guillemet double.
  * Chaque String est précédée d’une apostrophe.
  * Chaque String est entourée de guillemets doubles.

  Cela ne s’applique pas aux dates générées par Auth0 au format ISO 8601.

<div id="prerequisites">
  ## Prérequis
</div>

<Tabs>
  <Tab title="Auth0 Dashboard">
    * Vous devez avoir l’un des [rôles de membre du tenant](/docs/fr-ca/get-started/manage-dashboard-access/feature-access-by-role) suivants :
      * **Admin**
      * **Editor - Users**
      * **Dashboard Viewer - Users**
  </Tab>

  <Tab title="Management API">
    * Vous devez disposer d’un [jeton de la Management API](/docs/fr-ca/secure/tokens/access-tokens/management-api-access-tokens) ou en créer un pour effectuer des requêtes au endpoint des jobs, avec les scopes nécessaires pour le [endpoint de création d’un job d’exportation d’utilisateurs](/docs/fr-ca/api/management/v2/jobs/post-users-exports).
  </Tab>
</Tabs>

<div id="1-submit-export-users-job">
  ## 1. Soumettre un job d’exportation d’utilisateurs
</div>

<Tabs>
  <Tab title="Auth0 Dashboard">
    Pour exporter des données utilisateur à l’aide du Auth0 Dashboard :

    1. Accédez à [**Dashboard > Gestion des utilisateurs > Utilisateurs**](https://manage.auth0.com/#/users).

    2. Dans le coin supérieur droit de la page, sélectionnez **Importer/exporter des utilisateurs** pour accéder à la page **Importer/exporter des utilisateurs**.

    3. Sélectionnez **Exporter les utilisateurs** pour accéder à la page **Exporter les utilisateurs**.

           <Frame>
             <img src="https://mintcdn.com/translations/Dcx0M11uuptU53TX/docs/images/cdy7uua7fh8z/2koXwmAu99VfxJIq49yGGq/394be27431b66cfd09866ef91b0e0cd0/exportusers.png?fit=max&auto=format&n=Dcx0M11uuptU53TX&q=85&s=922096301869f451996de761b508cb76" alt="" width="1999" height="1628" data-path="docs/images/cdy7uua7fh8z/2koXwmAu99VfxJIq49yGGq/394be27431b66cfd09866ef91b0e0cd0/exportusers.png" />
           </Frame>

    4. Dans la section **Paramètres d’exportation** :

       * Sous **Connexion**, ouvrez le menu déroulant et sélectionnez la connexion à la base de données à partir de laquelle vous souhaitez exporter les données utilisateur.

       * Sous **Format d’exportation**, ouvrez le menu déroulant et sélectionnez le format souhaité pour les données (JSON ou CSV).

    5. Dans la section **Champs d’exportation**, choisissez les champs à inclure dans l’exportation :

       * Utilisez la bascule **Inclure les champs par défaut** pour ajouter les champs du [schéma de profil utilisateur normalisé Auth0](/docs/fr-ca/manage-users/user-accounts/user-profiles/normalized-user-profile-schema).

       * Sélectionnez **Ajouter des champs** et entrez un **attribut utilisateur** et un **nom de champ** pour ajouter des champs précis.

    6. Facultativement, dans la section **Champs d’exportation**, cochez **Exporter comme échantillon** pour limiter l’exportation à 10 utilisateurs. Cela peut être utile pour valider la structure du fichier d’exportation.

    7. Pour soumettre le job, sélectionnez **Exporter les utilisateurs**.
  </Tab>

  <Tab title="Management API">
    Pour exporter les données d’utilisateur à l’aide de l’API Management, appelez le [point de terminaison Create export users job](/docs/fr-ca/api/management/v2/jobs/post-users-exports) (`POST /jobs/users-exports`). Consultez la documentation du point de terminaison pour connaître les paramètres du corps de la requête et les schémas de réponse.

    Si vous omettez le `connection_id`, l’endpoint exporte les données des utilisateurs de toutes les connections du tenant.

    <Tip>
      Vous pouvez [consulter l’ID de la connexion à la base de données dans le Dashboard](/docs/fr-ca/authenticate/identity-providers/locate-the-connection-id) ou l’obtenir à l’aide de l’[endpoint Obtenir toutes les connexions](/docs/fr-ca/api/management/v2/connections/get-connections) de la Management API.
    </Tip>

    Pour utiliser les exemples ci-dessous, remplacez les variables fictives par vos propres valeurs.

    <AuthCodeGroup>
      ```bash cURL theme={null}
      curl --request POST \
        --url 'https://{yourDomain}/api/v2/jobs/users-exports' \
        --header 'authorization: Bearer {yourMgmtAPIAccessToken}' \
        --header 'content-type: application/json' \
        --data '{"connection_id": "{yourConnectionId}", "format": "csv", "limit": 5, "fields": [{"name": "email"}, { "name": "identities[0].connection", "export_as": "provider" }]}'
      ```

      ```csharp C# theme={null}
      var client = new RestClient("https://{yourDomain}/api/v2/jobs/users-exports");
      var request = new RestRequest(Method.POST);
      request.AddHeader("authorization", "Bearer {yourMgmtAPIAccessToken}");
      request.AddHeader("content-type", "application/json");
      request.AddParameter("application/json", "{"connection_id": "{yourConnectionId}", "format": "csv", "limit": 5, "fields": [{"name": "email"}, { "name": "identities[0].connection", "export_as": "provider" }]}", ParameterType.RequestBody);
      IRestResponse response = client.Execute(request);
      ```

      ```go Go theme={null}
      package main

      import (
      	"fmt"
      	"strings"
      	"net/http"
      	"io/ioutil"
      )

      func main() {

      	url := "https://{yourDomain}/api/v2/jobs/users-exports"

      	payload := strings.NewReader("{"connection_id": "{yourConnectionId}", "format": "csv", "limit": 5, "fields": [{"name": "email"}, { "name": "identities[0].connection", "export_as": "provider" }]}")

      	req, _ := http.NewRequest("POST", url, payload)

      	req.Header.Add("authorization", "Bearer {yourMgmtAPIAccessToken}")
      	req.Header.Add("content-type", "application/json")

      	res, _ := http.DefaultClient.Do(req)

      	defer res.Body.Close()
      	body, _ := ioutil.ReadAll(res.Body)

      	fmt.Println(res)
      	fmt.Println(string(body))

      }
      ```

      ```java Java theme={null}
      HttpResponse<String> response = Unirest.post("https://{yourDomain}/api/v2/jobs/users-exports")
        .header("authorization", "Bearer {yourMgmtAPIAccessToken}")
        .header("content-type", "application/json")
        .body("{"connection_id": "{yourConnectionId}", "format": "csv", "limit": 5, "fields": [{"name": "email"}, { "name": "identities[0].connection", "export_as": "provider" }]}")
        .asString();
      ```

      ```javascript Node.JS theme={null}
      var axios = require("axios").default;

      var options = {
        method: 'POST',
        url: 'https://{yourDomain}/api/v2/jobs/users-exports',
        headers: {
          authorization: 'Bearer {yourMgmtAPIAccessToken}',
          'content-type': 'application/json'
        },
        data: {
          connection_id: '{yourConnectionId}',
          format: 'csv',
          limit: 5,
          fields: [{name: 'email'}, {name: 'identities[0].connection', export_as: 'provider'}]
        }
      };

      axios.request(options).then(function (response) {
        console.log(response.data);
      }).catch(function (error) {
        console.error(error);
      });
      ```

      ```php PHP theme={null}
      $curl = curl_init();

      curl_setopt_array($curl, [
        CURLOPT_URL => "https://{yourDomain}/api/v2/jobs/users-exports",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => "{"connection_id": "{yourConnectionId}", "format": "csv", "limit": 5, "fields": [{"name": "email"}, { "name": "identities[0].connection", "export_as": "provider" }]}",
        CURLOPT_HTTPHEADER => [
          "authorization: Bearer {yourMgmtAPIAccessToken}",
          "content-type: application/json"
        ],
      ]);

      $response = curl_exec($curl);
      $err = curl_error($curl);

      curl_close($curl);

      if ($err) {
        echo "cURL Error #:" . $err;
      } else {
        echo $response;
      }
      ```

      ```python Python theme={null}
      import http.client

      conn = http.client.HTTPSConnection("")

      payload = "{"connection_id": "{yourConnectionId}", "format": "csv", "limit": 5, "fields": [{"name": "email"}, { "name": "identities[0].connection", "export_as": "provider" }]}"

      headers = {
          'authorization': "Bearer {yourMgmtAPIAccessToken}",
          'content-type': "application/json"
          }

      conn.request("POST", "/{yourDomain}/api/v2/jobs/users-exports", payload, headers)

      res = conn.getresponse()
      data = res.read()

      print(data.decode("utf-8"))
      ```

      ```ruby Ruby theme={null}
      require 'uri'
      require 'net/http'
      require 'openssl'

      url = URI("https://{yourDomain}/api/v2/jobs/users-exports")

      http = Net::HTTP.new(url.host, url.port)
      http.use_ssl = true
      http.verify_mode = OpenSSL::SSL::VERIFY_PEER

      request = Net::HTTP::Post.new(url)
      request["authorization"] = 'Bearer {yourMgmtAPIAccessToken}'
      request["content-type"] = 'application/json'
      request.body = "{"connection_id": "{yourConnectionId}", "format": "csv", "limit": 5, "fields": [{"name": "email"}, { "name": "identities[0].connection", "export_as": "provider" }]}"

      response = http.request(request)
      puts response.read_body
      ```
    </AuthCodeGroup>

    Lorsque vous créez un job avec succès, la valeur de retour comprend des renseignements sur le job, y compris son ID.
  </Tab>
</Tabs>

<div id="2-check-job-status-and-download-the-export">
  ## 2. Vérifier le statut d’un job et télécharger l’exportation
</div>

<Tabs>
  <Tab title="Auth0 Dashboard">
    Pour vérifier le statut d’un job :

    1. Accédez à [**Dashboard > User Management > Users**](https://manage.auth0.com/#/users).

    2. Dans le coin supérieur droit de la page, sélectionnez **Import/Export Users** pour accéder à la page **Import/Export Users**. Une fois que vous avez lancé au moins un job, cette page répertorie les jobs que vous avez soumis.

    3. Pour chaque job, vous pouvez sélectionner :

       * **Check Status** pour suivre la progression du job.

       * **Download export** pour télécharger le résultat.

       * **More info** pour consulter les erreurs ou les métadonnées du job.
  </Tab>

  <Tab title="Management API">
    Pour vérifier le statut d’un job, appelez le [endpoint Get a job](/docs/fr-ca/api/management/v2/jobs/get-jobs-by-id) (`GET /jobs`) avec l’ID du job. Consultez la documentation de l’endpoint pour en savoir plus sur ses paramètres et les schémas de réponse.

    Le nom de votre tenant correspond également au nom de votre fichier. Par exemple, si votre tenant s’appelle `auth0docs`, votre fichier sera `auth0docs.csv` ou `auth0docs.json`.

    Vous pouvez accéder à vos fichiers d’exportation à l’aide de l’URL fournie comme valeur du paramètre `location`. Lorsque vous accédez à cette URL, le téléchargement du fichier commence automatiquement.
  </Tab>
</Tabs>

Le lien de téléchargement est valide pendant 60 secondes. Une fois ce délai écoulé, vous disposez de 24 heures pour appeler de nouveau l’endpoint avant l’expiration du job.

<div id="limits">
  ## Limites
</div>

* Toutes les données associées aux jobs sont automatiquement supprimées après 24 heures.

* Les exportations de données au format CSV sont limitées à 30 champs.

* Les exportations de données au format CSV ne peuvent pas inclure `app_metadata` ou `user_metadata` sous forme d’objets uniques. Indiquez plutôt explicitement les champs des objets de métadonnées ou exportez les données dans un format compatible avec JSON (qui permet d’exporter les métadonnées sous forme d’objets uniques) :

  <Columns>
    <Column>
      ```json Corps de la requête au format compatible avec JSON theme={null}
      {
        "format": "json",
        "fields": [
          { "name": "user_metadata.example" }
        ]
      }
      ```
    </Column>

    <Column>
      ```json Corps de la requête au format CSV theme={null}
      {
        "format": "csv",
        "fields": [
          { "name": "user_metadata.example.field_one" },
          { "name": "user_metadata.example.field_two" },
          { "name": "user_metadata.example.field_three" }
        ]
      }
      ```
    </Column>
  </Columns>
