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

# Consentement de l’utilisateur et applications tierces

> Découvrez comment Auth0 gère le consentement de l’utilisateur lorsque des applications demandent à accéder aux API en son nom.

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

OAuth permet aux applications d’accéder aux API au nom de l’utilisateur. Avant qu’une application puisse agir au nom d’un utilisateur, celui-ci doit approuver explicitement les permissions demandées. Cette étape d’approbation s’appelle le consentement de l’utilisateur.

Pour les [applications tierces](/docs/fr-ca/get-started/applications/third-party-applications), le consentement de l’utilisateur est toujours requis. L’utilisateur doit approuver chaque requête d’autorisation. Pour les [applications de première partie](/docs/fr-ca/get-started/applications/first-party-and-third-party-applications), il est possible de ne pas demander ce consentement lorsque cette option est configurée, puisque vous contrôlez l’application et lui faites confiance pour agir de manière appropriée.

<div id="consent-dialog">
  ## Boîte de dialogue de consentement
</div>

Lorsqu’une application tierce redirige un utilisateur vers le point de terminaison `/authorize` et demande l’accès à une API, Auth0 affiche une boîte de dialogue de consentement qui répertorie les permissions demandées par l’application.

La requête d’autorisation suivante affiche une boîte de dialogue de consentement demandant à l’utilisateur d’approuver les permissions `read:posts` et `write:posts` pour l’API :

```http wrap lines theme={null}
GET /authorize?
  client_id=tpc_THIRD_PARTY_CLIENT_ID
  &redirect_uri=https://partner.example.com/callback
  &response_type=code
  &scope=read:posts write:posts
  &audience=https://social.example.com
  &code_challenge=CODE_CHALLENGE
  &code_challenge_method=S256
  &state=STATE_VALUE
```

<Frame>
  <img src="https://mintcdn.com/translations/MV7tE-x71x8RWRES/docs/images/cdy7uua7fh8z/5Cz3aZKw8RRVlMkc5Zl6x7/62ac54cbc470286d5c2139d47c604ebc/2025-02-28_14-57-52.png?fit=max&auto=format&n=MV7tE-x71x8RWRES&q=85&s=c1b1fcb30cec8913b375571e6d396a00" alt="Autorisation - Consentement de l’utilisateur et applications - boîte de dialogue de consentement" width="391" height="698" data-path="docs/images/cdy7uua7fh8z/5Cz3aZKw8RRVlMkc5Zl6x7/62ac54cbc470286d5c2139d47c604ebc/2025-02-28_14-57-52.png" />
</Frame>

Si l’utilisateur accepte, Auth0 crée une autorisation utilisateur qui représente le consentement de l’utilisateur pour cette combinaison d’application, d’API et de portées demandées. L’application reçoit un code d’autorisation comme d’habitude.

Une fois le consentement accordé, l’utilisateur ne voit plus la boîte de dialogue de consentement lors des ouvertures de session suivantes, jusqu’à ce que ce consentement soit révoqué explicitement.

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Les applications tierces avec des contrôles de sécurité renforcés ne prennent pas en charge les portées OIDC (`openid`, `profile`, `email`) dans cette version. La boîte de dialogue de consentement affiche uniquement les portées d’API. La prise en charge d’OIDC pour les applications tierces est prévue dans une version future.
</Callout>

<div id="scope-descriptions">
  ## Descriptions des scopes
</div>

Par défaut, la page de consentement utilise les noms de scope pour obtenir le consentement de l’utilisateur. Comme illustré ci-dessous, définissez les scopes au format `action:resource_name` pour un affichage clair :

<Frame>
  <img src="https://mintcdn.com/translations/3nS3prIggmJG9TUI/docs/images/cdy7uua7fh8z/3Z4Ofbj5yF7eg5cLfcauh9/556bab9e627b0ff68b20664d149f1483/Blog_API_Permissions_-_English.png?fit=max&auto=format&n=3nS3prIggmJG9TUI&q=85&s=a716a58beca5daa6c9c12b4384e0a4a3" alt="Authorization - Consentement de l’utilisateur et applications - Scopes de consentement" width="1002" height="687" data-path="docs/images/cdy7uua7fh8z/3Z4Ofbj5yF7eg5cLfcauh9/556bab9e627b0ff68b20664d149f1483/Blog_API_Permissions_-_English.png" />
</Frame>

La page de consentement regroupe les scopes d’une même API et affiche toutes les actions sur une seule ligne. Par exemple, la configuration ci-dessus produit **Posts: lire et écrire vos publications**.

Pour afficher le champ **Description** au lieu du nom du scope, définissez l’indicateur `use_scope_descriptions_for_consent` du tenant sur `true` :

<AuthCodeGroup>
  ```bash cURL wrap lines theme={null}
  curl --request PATCH \
    --url 'https://YOUR_DOMAIN/api/v2/tenants/settings' \
    --header 'Authorization: Bearer YOUR_MANAGEMENT_API_TOKEN' \
    --header 'Content-Type: application/json' \
    --data '{ "flags": { "use_scope_descriptions_for_consent": true } }'
  ```
</AuthCodeGroup>

Ce paramètre s’applique aux invites de consentement de toutes les API du tenant.

<div id="handle-rejected-permissions">
  ## Gérer les permissions refusées
</div>

Lorsqu’un utilisateur refuse de donner son consentement, le comportement dépend de la [politique de redirection](/docs/fr-ca/get-started/applications/third-party-applications/security-controls#redirect-protection) de l’application :

* **`open_redirect_protection`** (par défaut pour les applications tierces) : Auth0 affiche une page d’erreur au lieu de rediriger l’utilisateur. Cela empêche les attaques par redirection ouverte.
* **`allow_always`** : Auth0 redirige vers le `redirect_uri` avec une erreur `access_denied` :

```http wrap lines theme={null}
HTTP/1.1 302 Found
Location: https://partner.example.com/callback?
    error=access_denied
    &state=STATE_VALUE
```

<div id="skip-consent-for-first-party-applications">
  ## Ignorer le consentement pour les applications de première partie
</div>

Les applications de première partie peuvent ignorer la boîte de dialogue de consentement lorsque l’option **Allow Skipping User Consent** est activée pour l’API.

Pour accéder à la bascule **Allow Skipping User Consent**, sélectionnez **Applications > APIs > (sélectionnez l’API) > Settings > Paramètres d’accès**.

Les applications tierces exigent toujours le consentement et ne peuvent pas ignorer la boîte de dialogue de consentement.

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Même lorsque le consentement est ignoré pour les applications de première partie, une invite de confirmation de connexion peut quand même s’afficher lorsque l’application utilise un URI de rappel non vérifiable (comme `localhost` ou un schéma d’URI personnalisé). Cela protège les utilisateurs contre l’usurpation d’une application sur le même appareil. Pour en savoir plus, consultez [Mesures contre l’usurpation d’application](/docs/fr-ca/secure/security-guidance/measures-against-app-impersonation).
</Callout>

<div id="consent-with-organizations">
  ## Consentement avec les Organizations
</div>

Lorsqu'une application tierce authentifie des utilisateurs dans le contexte d'une [Organization](/docs/fr-ca/manage-users/organizations), le consentement est associé à cette Organization. Un utilisateur qui consent à une application dans une Organization n'a pas consenti à cette même application dans une autre Organization.

<Frame>
  <img src="https://mintcdn.com/translations/lC_NOnQ2Wbrs3KdZ/docs/images/third-party-applications/org-scoped-consent-acme.png?fit=max&auto=format&n=lC_NOnQ2Wbrs3KdZ&q=85&s=13b226bde99402820b37293d967af740" alt="Boîte de dialogue de consentement pour l'Organization Acme — application tierce demandant l'accès au compte Acme de l'utilisateur" width="397" height="563" data-path="docs/images/third-party-applications/org-scoped-consent-acme.png" />
</Frame>

Cela signifie :

* Un utilisateur qui accède à la même application tierce à partir d'une nouvelle Organization voit de nouveau la boîte de dialogue de consentement, même s'il y avait déjà consenti dans une autre Organization.
* La révocation du consentement dans une Organization n'a aucune incidence sur le consentement dans une autre.
* L'autorisation est enregistrée pour chaque Organization.

<Frame>
  <img src="https://mintcdn.com/translations/lC_NOnQ2Wbrs3KdZ/docs/images/third-party-applications/org-scoped-consent-contoso.png?fit=max&auto=format&n=lC_NOnQ2Wbrs3KdZ&q=85&s=4b8116fbf32503d678569ee0f42bb506" alt="Boîte de dialogue de consentement pour l'Organization Contoso — le même utilisateur doit consentir de nouveau pour une autre Organization" width="395" height="564" data-path="docs/images/third-party-applications/org-scoped-consent-contoso.png" />
</Frame>

Pour forcer un nouveau consentement dans le contexte d'une Organization précise, incluez `prompt=consent` dans la requête `/authorize`.

<div id="revoke-consent">
  ## Révoquer le consentement
</div>

Pour révoquer le consentement d’un utilisateur pour une application donnée :

1. Accédez à **Auth0 Dashboard > User Management > Users**.
2. Sélectionnez l’utilisateur.
3. Sélectionnez l’onglet **Authorized Applications**.
4. Sélectionnez **Revoke** à côté de l’application.

<div id="password-based-flows">
  ## Flux avec mot de passe
</div>

Le [Resource Owner Password Flow](/docs/fr-ca/get-started/authentication-and-authorization-flow/resource-owner-password-flow) n’est pas offert pour les applications tierces. Il s’applique uniquement aux applications de première partie.

Pour les applications de première partie, aucun consentement n’est requis, puisque l’utilisateur fournit directement son mot de passe à l’application, ce qui revient à lui accorder un accès complet à son compte.

<div id="force-consent">
  ## Forcer le consentement
</div>

Pour obliger les utilisateurs à donner leur consentement à chaque connexion (même s’ils disposent déjà d’une autorisation), incluez `prompt=consent` dans la requête `/authorize` :

```http wrap lines theme={null}
GET /authorize?
  client_id=tpc_THIRD_PARTY_CLIENT_ID
  &redirect_uri=https://partner.example.com/callback
  &response_type=code
  &scope=read:posts write:posts
  &audience=https://social.example.com
  &prompt=consent
  &code_challenge=CODE_CHALLENGE
  &code_challenge_method=S256
  &state=STATE_VALUE
```

<div id="learn-more">
  ## En savoir plus
</div>

* [Applications tierces](/docs/fr-ca/get-started/applications/third-party-applications)
* [Applications propriétaires et applications tierces](/docs/fr-ca/get-started/applications/first-party-and-third-party-applications)
* [Contrôles de sécurité pour les applications tierces](/docs/fr-ca/get-started/applications/third-party-applications/security-controls)
* [Types d’autorisation des applications](/docs/fr-ca/get-started/applications/application-grant-types)
* [Mesures contre l’usurpation d’application](/docs/fr-ca/secure/security-guidance/measures-against-app-impersonation)
