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

# Configurer la délégation de session

> Découvrez comment configurer les paramètres client nécessaires pour demander et accepter des sessions déléguées.

export const ReleaseStageNotice = ({feature, stage, plans, contact, terms}) => {
  const stageTextMap = {
    "beta": "bêta",
    "ea": "Accès anticipé"
  };
  const stageText = stageTextMap[stage] || "une phase de lancement du produit";
  const prsLink = "/docs/troubleshoot/product-lifecycle/product-release-stages";
  const linkify = (text, url) => {
    return <a href={url} target="_blank" rel="noreferrer" class="link">{text}</a>;
  };
  const includeDetails = (plans, contact, terms) => {
    const hasDetails = terms || plans || contact;
    if (!hasDetails) return null;
    return <span data-as="p">
            {plans && <>Cette fonctionnalité est offerte avec les forfaits {linkify(`${plans}`, "https://auth0.com/pricing")}. </>}
            {contact && "Pour y participer, communiquez avec " + contact + ". "}
            {terms && <>En utilisant cette fonctionnalité, vous acceptez les conditions applicables de l’essai gratuit énoncées dans le {linkify("Master Subscription Agreement", "https://www.okta.com/legal")} d’Okta.</>}
        </span>;
  };
  return <Warning>
            <span data-as="p">
                <strong>La fonctionnalité {feature} est en {linkify(stageText, prsLink)}.</strong>
            </span>

            {includeDetails(plans, contact, terms)}
        </Warning>;
};

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

<ReleaseStageNotice feature="délégation de session" stage="ea" plans="B2C Professional, B2B Professional et Enterprise" terms="true" />

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Cette page porte uniquement sur la configuration. Consultez [Implement délégation de session](/docs/fr-ca/authenticate/single-sign-on/session-delegation/implement-session-delegation) pour en savoir plus sur le modèle de sécurité et les détails des requêtes et des réponses une fois les deux applications ci-dessous configurées.
</Callout>

<div id="configure-your-applications">
  ## Configurez vos applications
</div>

<div id="configure-the-requesting-application">
  ### Configurer l’application demandeuse
</div>

L’application qui appelle l’échange de jetons personnalisé afin d’obtenir un jeton de transfert de session doit avoir l’échange de jetons personnalisé activé et pouvoir créer un jeton de transfert de session :

```json lines theme={null}
{
  "token_exchange": {
    "allow_any_profile_of_type": ["custom_authentication"]
  },
  "session_transfer": {
    "can_create_session_transfer_token": true,
    "enforce_cascade_revocation": true
  }
}
```

export const codeExample1 = `curl --request PATCH \
  --url 'https://{yourDomain}/api/v2/clients/{yourClientId}' \
  --header 'authorization: Bearer {yourMgmtApiAccessToken}' \
  --header 'content-type: application/json' \
  --data '{
  "token_exchange": {
    "allow_any_profile_of_type": ["custom_authentication"]
  },
  "session_transfer": {
    "can_create_session_transfer_token": true,
    "enforce_cascade_revocation": true
  }
}'`;

<AuthCodeBlock children={codeExample1} language="bash" filename="cURL" />

Consultez [Créer et gérer les jetons de transfert de session](/docs/fr-ca/authenticate/single-sign-on/native-to-web/configure-implement-native-to-web#create-and-manage-session-transfer-tokens) pour en savoir plus sur le paramètre `can_create_session_transfer_token`.

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  L’application qui appelle l’échange de jetons personnalisé pour demander un jeton de transfert de session doit être un client confidentiel et s’authentifier à l’aide d’un secret client (ou d’une autre méthode destinée aux clients confidentiels). Contrairement à une requête d’échange de jetons personnalisé standard, l’option de client public `tokenEndpointAuthMethod: none` n’est pas prise en charge lors d’une demande de jeton de transfert de session.
</Callout>

<div id="configure-the-target-web-application">
  ### Configurer l’application Web cible
</div>

Votre application Web doit explicitement accepter les sessions déléguées et le jeton de transfert de session comme paramètre de requête sur `/authorize` :

```json lines theme={null}
{
    "session_transfer": {
        "allowed_authentication_methods": ["cookie", "query"],
        "enforce_device_binding": "ip", // aussi "none" ou "asn"
        "allow_refresh_token": false,
        "enforce_online_refresh_tokens": true,
        "delegation": {
           "allow_delegated_access": true,
           "enforce_device_binding": "ip" // il s'agit de la seule valeur autorisée pour delegation
        }
    }
}
```

export const codeExample2 = `curl --request PATCH \
  --url 'https://{yourDomain}/api/v2/clients/{yourClientId}' \
  --header 'authorization: Bearer {yourMgmtApiAccessToken}' \
  --header 'content-type: application/json' \
  --data '{
    "session_transfer": {
        "allowed_authentication_methods": ["cookie", "query"],
        "enforce_device_binding": "ip",
        "allow_refresh_token": false,
        "enforce_online_refresh_tokens": true,
        "delegation": {
           "allow_delegated_access": true,
           "enforce_device_binding": "ip"
        }
    }
}'`;

<AuthCodeBlock children={codeExample2} language="bash" filename="cURL" />

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  `allowed_authentication_methods` doit inclure `query`, car la délégation de session transmet le jeton de transfert de session comme paramètre de requête d’URL; le transfert par témoins utilisé par Native to Web SSO ne s’applique pas ici. `delegation.enforce_device_binding` n’accepte que `"ip"`, et la liaison d’appareil basée sur l’adresse IP est automatiquement appliquée aux sessions déléguées. Cette configuration est désactivée par défaut et aucune bascule équivalente n’est actuellement offerte dans l’interface utilisateur du Dashboard : configurez-la au moyen de la Management API ou de vos outils d’infrastructure-as-code (Terraform, Deploy CLI).

  Si un jeton de transfert de session contenant un acteur est présenté à un client pour lequel `allow_delegated_access` n’est pas activé, Auth0 ne renvoie pas d’erreur; il affiche plutôt la page de connexion et génère un journal d’avertissement (`w`) du tenant. Vérifiez ce point si une session déléguée revient inopinément à une invite de connexion.
</Callout>

Une fois les deux applications configurées, consultez [Implement délégation de session](/docs/fr-ca/authenticate/single-sign-on/session-delegation/implement-session-delegation) pour effectuer les requêtes, puis [Delegated Session Behavior and Monitoring](/docs/fr-ca/authenticate/single-sign-on/session-delegation/session-delegation-behavior-and-monitoring) pour comprendre le comportement des sessions et la journalisation d’audit.
