> ## 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.

# Comment répertorier et rechercher des utilisateurs à l’aide de requêtes de recherche

> Récupérez la liste de tous les profils utilisateur et filtrez les résultats à l’aide de chaînes de requête de recherche Lucene.

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

À l’aide du Auth0 Dashboard ou de la Management API, vous pouvez récupérer une liste d’utilisateurs et filtrer les résultats selon les critères de recherche de votre choix.

<div id="list-and-search-for-users">
  ## Lister et rechercher des utilisateurs
</div>

<Tabs>
  <Tab title="Auth0 Dashboard">
    Pour afficher la liste des utilisateurs, accédez à [Dashboard > User Management > Users](https://manage.auth0.com/#/users).

    <img src="https://mintcdn.com/translations/-d41Muac7Op9CEDm/docs/images/user-management/users.png?fit=max&auto=format&n=-d41Muac7Op9CEDm&q=85&s=81c22fb01f56a93ce730d8e1c39938c4" alt="La page Users dans l’Auth0 Dashboard" width="1229" height="459" data-path="docs/images/user-management/users.png" />

    Le champ de recherche et le menu déroulant situés en haut de la page vous permettent d’effectuer une recherche selon les propriétés suivantes :

    * Utilisateur
    * Courriel
    * Fournisseur d’identité
    * Connexion
    * ID d’organisation
    * Nombre de connexions
    * Dernière connexion
    * Numéro de téléphone

    Vous pouvez également sélectionner **Lucene Syntax (Advanced)** pour définir des critères de recherche. La [référence de la syntaxe des requêtes de recherche](./user-search-query-syntax) contient davantage d’information sur les fonctionnalités de recherche prises en charge et des exemples de requêtes.
  </Tab>

  <Tab title="Management API">
    L’[endpoint permettant de répertorier ou de rechercher des utilisateurs](/docs/fr-ca/api/management/v2/users/get-users) (`GET /users`) de la Management API est à cohérence éventuelle. Les résultats peuvent donc ne pas refléter immédiatement les opérations d’écriture récemment effectuées. Nous recommandons d’utiliser cet endpoint pour les opérations qui ne sont pas urgentes, comme modifier le nom d’affichage d’un utilisateur existant.

    <Warning>
      **Quand utiliser le point de terminaison List or Search Users**

      * N’utilisez pas ce point de terminaison dans le cadre d’un processus d’authentification, pour la [liaison de comptes](/docs/fr-ca/manage-users/user-accounts/user-account-linking) ou lorsqu’une cohérence immédiate est requise. Utilisez plutôt les points de terminaison de la Management API pour [obtenir des utilisateurs par ID ou par courriel](/docs/fr-ca/manage-users/user-search/get-users-by-id-or-email).

      * N’utilisez pas le point de terminaison List or Search Users pour exporter des utilisateurs. Utilisez plutôt les [exportations d’utilisateurs en bloc](/docs/fr-ca/manage-users/user-migration/bulk-user-exports).
    </Warning>

    Pour obtenir la liste de tous les utilisateurs avec la Management API, effectuez une requête à l’[endpoint List or Search Users](/docs/fr-ca/api/management/v2/users/get-users) (`GET /users`). Pour rechercher des utilisateurs, précisez les critères de recherche à l’aide du [query parameter `q`](/docs/fr-ca/api/management/v2/users/get-users#parameter-q) et d’une [query string de recherche Lucene](./user-search-query-syntax).

    Par exemple, pour rechercher un utilisateur dont le nom est exactement `example` :

    <AuthCodeGroup>
      ```bash curl theme={null}
      curl --request GET \
        --url 'https://{yourDomain}/api/v2/users?q=name%3A%22example%22&search_engine=v3' \
        --header 'authorization: Bearer {yourMgmtApiAccessToken}'
      ```

      ```csharp C# theme={null}
      var client = new RestClient("https://{yourDomain}/api/v2/users?q=name%3A%22example%22&search_engine=v3");
      var request = new RestRequest(Method.GET);
      request.AddHeader("authorization", "Bearer {yourMgmtApiAccessToken}");
      IRestResponse response = client.Execute(request);
      ```

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

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

      func main() {
      	url := "https://{yourDomain}/api/v2/users?q=name%3A%22example%22&search_engine=v3"
      	req, _ := http.NewRequest("GET", url, nil)
      	req.Header.Add("authorization", "Bearer {yourMgmtApiAccessToken}")

      	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.get("https://{yourDomain}/api/v2/users?q=name%3A%22example%22&search_engine=v3")
        .header("authorization", "Bearer {yourMgmtApiAccessToken}")
        .asString();
      ```

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

      var options = {
        method: 'GET',
        url: 'https://{yourDomain}/api/v2/users',
        params: {q: 'name:"example"', search_engine: 'v3'},
        headers: {authorization: 'Bearer {yourMgmtApiAccessToken}'}
      };

      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/users?q=name%3A%22example%22&search_engine=v3",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_HTTPHEADER => [
          "authorization: Bearer {yourMgmtApiAccessToken}"
        ],
      ]);

      $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("")
      headers = { 'authorization': "Bearer {yourMgmtApiAccessToken}" }
      conn.request("GET", "/{yourDomain}/api/v2/users?q=name%3A%22example%22&search_engine=v3", headers=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/users?q=name%3A%22example%22&search_engine=v3")

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

      request = Net::HTTP::Get.new(url)
      request["authorization"] = 'Bearer {yourMgmtApiAccessToken}'

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

    Les requêtes de recherche expirent (code d’état HTTP 503) si elles ne s’exécutent pas en deux secondes ou moins. Si votre requête de recherche expire, c’est peut-être qu’elle est trop coûteuse ou qu’elle comporte une erreur qui l’empêche de s’exécuter à temps.

    L'erreur `414 Request-URI Too Large` signifie que votre query string dépasse la longueur prise en charge. Dans ce cas, affinez votre recherche.

    La [référence de la syntaxe des requêtes de recherche](./user-search-query-syntax) fournit plus de renseignements sur les fonctionnalités de recherche prises en charge, ainsi que des exemples de requêtes.
  </Tab>
</Tabs>

<div id="sort-results">
  ## Trier les résultats
</div>

<Tabs>
  <Tab title="Auth0 Dashboard">
    Dans l’Auth0 Dashboard, vous pouvez trier les résultats en sélectionnant les colonnes disponibles dans la table des utilisateurs :

    * Nom
    * ID utilisateur
    * Connection
    * Connexions
    * Dernière connexion

    Sélectionnez une fois le titre d’une colonne pour trier par ordre croissant, puis une deuxième fois pour trier par ordre décroissant. Pour trier les résultats selon d’autres champs, utilisez la Management API.
  </Tab>

  <Tab title="Management API">
    Pour trier les résultats de la recherche d’utilisateurs, attribuez au [paramètre de requête `sort`](/docs/fr-ca/api/management/v2/users/get-users#parameter-sort) la valeur `field:order`, où :

    * `field` est le nom du champ selon lequel effectuer le tri
    * `order` vaut `1` pour l’ordre croissant ou `-1` pour l’ordre décroissant.

    Par exemple, pour trier les utilisateurs en ordre croissant selon leur date de création, attribuez au paramètre `sort` la valeur `created_at:1` :

    <AuthCodeGroup>
      ```bash curl theme={null}
      curl --request GET \
        --url 'https://{yourDomain}/api/v2/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3' \
        --header 'authorization: Bearer {yourMgmtApiAccessToken}'
      ```

      ```csharp C# theme={null}
      var client = new RestClient("https://{yourDomain}/api/v2/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3");
      var request = new RestRequest(Method.GET);
      request.AddHeader("authorization", "Bearer {yourMgmtApiAccessToken}");
      IRestResponse response = client.Execute(request);
      ```

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

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

      func main() {
      	url := "https://{yourDomain}/api/v2/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3"
      	req, _ := http.NewRequest("GET", url, nil)
      	req.Header.Add("authorization", "Bearer {yourMgmtApiAccessToken}")

      	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.get("https://{yourDomain}/api/v2/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3")
        .header("authorization", "Bearer {yourMgmtApiAccessToken}")
        .asString();
      ```

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

      var options = {
        method: 'GET',
        url: 'https://{yourDomain}/api/v2/users',
        params: {q: 'logins_count:[100 TO 200]', sort: 'created_at:1', search_engine: 'v3'},
        headers: {authorization: 'Bearer {yourMgmtApiAccessToken}'}
      };

      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/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_HTTPHEADER => [
          "authorization: Bearer {yourMgmtApiAccessToken}"
        ],
      ]);

      $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("")
      headers = { 'authorization': "Bearer {yourMgmtApiAccessToken}" }
      conn.request("GET", "/{yourDomain}/api/v2/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3", headers=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/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3")

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

      request = Net::HTTP::Get.new(url)
      request["authorization"] = 'Bearer {yourMgmtApiAccessToken}'

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

<div id="performance-recommendations">
  ## Recommandations sur les performances
</div>

Suivez les recommandations suivantes pour optimiser les performances de la recherche d’utilisateurs :

* Le endpoint List or Search Users de la Management API renvoie les résultats dans un ordre déterministe, de sorte qu’une même requête produit toujours les mêmes résultats dans le même ordre logique. La recherche non déterministe est plus rapide. Si une recherche déterministe n’est pas nécessaire pour votre cas d’utilisation, optez pour une recherche non déterministe en définissant `primary_order=false`.

* Échappez les espaces (par exemple, écrivez `q=name:John Doe` sous la forme `q=name:John\ Doe`).

* Limitez l’utilisation des caractères génériques, surtout avec de grands ensembles de données. Lorsque vous les utilisez, privilégiez les suffixes plutôt que les préfixes du terme de recherche.

* Évitez les critères de recherche qui renvoient plus de 1 000 résultats.

* Évitez les requêtes d’existence (par exemple, « donnez-moi tous les utilisateurs ayant une propriété, quelle que soit sa valeur »).

* Pour les attributs définis par l’utilisateur dans `app_metadata` et `user_metadata` :

  * Limitez les champs de métadonnées à 2 Ko ou moins.

  * Utilisez des types de données cohérents et des noms fixes pour les propriétés de métadonnées.

  * Évitez les schémas volumineux et les structures imbriquées en profondeur.

* Évitez d’effectuer des recherches d’utilisateurs dans les points d’extension du flux de connexion, comme les Actions `post-login`.

* N’interrogez pas les API de recherche de façon répétée.

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

* La recherche renvoie au maximum 1 000 utilisateurs, même si votre requête correspond à un plus grand nombre d’utilisateurs. Lorsque vous utilisez l’API, les résultats volumineux sont [paginés](/docs/fr-ca/api/management/v2#pagination).

* L’endpoint List or Search Users de la Management API impose une [limite de 1 Mo de données utilisateur par utilisateur](/docs/fr-ca/manage-users/user-accounts/metadata/metadata-fields-data#size-limits-and-storage) pouvant être indexées, interrogées et renvoyées. Pour récupérer tous les attributs d’un profil utilisateur volumineux, [récupérez les utilisateurs par ID ou par courriel](/docs/fr-ca/manage-users/user-search/get-users-by-id-or-email).

* L’endpoint List or Search Users de la Management API ne prend pas en charge le tri selon `app_metadata` ou `user_metadata`.
