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

> Décrit comment migrer vos appels d’API Passwordless et les réponses correspondantes de /oauth/ro vers /oauth/token.

# Migrez votre Resource Owner Passwordless Credentials Exchange

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

La prise en charge du mot de passe du <Tooltip tip="Propriétaire de ressource : entité (comme un utilisateur ou une application) capable d’accorder l’accès à une ressource protégée." cta="Voir le glossaire" href="/docs/fr-ca/glossary?term=resource+owner">propriétaire de la ressource</Tooltip> a été ajoutée à `/oauth/token`. L’utilisation du point de terminaison `/oauth/ro` a été dépréciée le 8 juillet 2017. Le point de terminaison `/oauth/ro` servait auparavant à échanger un mot de passe à usage unique (OTP) reçu par l’utilisateur final par courriel ou par SMS contre un <Tooltip tip="Jeton d’identification : information d’identification destinée au client lui-même, plutôt qu’à l’accès à une ressource." cta="Voir le glossaire" href="/docs/fr-ca/glossary?term=ID+token">jeton d’identification</Tooltip> et un <Tooltip tip="Jeton d’accès : information d’identification d’autorisation, sous la forme d’une chaîne opaque ou d’un JWT, utilisée pour accéder à une API." cta="Voir le glossaire" href="/docs/fr-ca/glossary?term=access+token">jeton d’accès</Tooltip>. Auth0 a mis en place une nouvelle API qui remplace `/oauth/ro` pour ce cas d’utilisation, et nous vous recommandons de migrer vers ce nouveau point de terminaison.

<div id="features-affected">
  ## Fonctionnalités touchées
</div>

Ce changement vous concerne si vous utilisez l’échange des identifiants du propriétaire de la ressource <Tooltip tip="Sans mot de passe : forme d’authentification qui ne repose pas sur un mot de passe comme premier facteur." cta="Voir le glossaire" href="/docs/fr-ca/glossary?term=passwordless">sans mot de passe</Tooltip> et envoyez directement des requêtes à `/oauth/ro` sans utiliser de bibliothèques Auth0 ni de SDKs.

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Lorsqu’un jeton d’accès `/oauth/ro` d’un utilisateur expire, Auth0 l’oblige à s’authentifier de nouveau (déconnexion forcée requise), car le jeton d’actualisation `/oauth/ro` ne peut pas être utilisé pour envoyer une requête à `/oauth/token` afin d’obtenir un nouveau jeton d’accès. Tous les utilisateurs actuellement connectés devront se connecter de nouveau pendant la migration de `/oauth/ro` vers `/oauth/token`.
</Callout>

<div id="actions">
  ## Actions
</div>

<div id="request-changes">
  ### Modifications de la requête
</div>

Auparavant, la charge utile d’une requête envoyée à `/oauth/ro` ressemblait à ceci :

```json lines theme={null}
{
  "grant_type": "password",
  "client_id": "123",
  "username": "alice",
  "password": "A3ddj3w", 
  "connection": "my-database-connection",
  "scope": "openid email favorite_color offline_access",
  "device": "my-device-name"
}
```

Voici les changements apportés à la nouvelle mise en œuvre :

* Le point de terminaison pour exécuter les échanges de jetons est maintenant `/oauth/token`.
* Le type d’octroi propre à Auth0 est utilisé pour authentifier les utilisateurs à partir d’une connexion précise (ou d’un realm).
* Auth0 prend en charge les scopes OIDC standards, ainsi que les scopes que vous avez définis dans votre API personnalisée.
* Un scope qui ne correspond à aucune de ces catégories, comme `favorite_color` ci-dessus, n’est plus un scope valide.
* Le paramètre `device` a été supprimé.
* Le paramètre `audience` est facultatif.

Voici un exemple de la charge utile d’une requête à `/oauth/token` :

export const codeExample = `{
  "grant_type" : "http://auth0.com/oauth/grant-type/passwordless/otp",
  "client_id": "{yourClientId}",
  "client_secret": "{yourClientSecret}", // seulement pour les applications web; les applications natives n’ont pas de client secret
  "username": "{userEmailAddress}", // ou "{userPhoneNumber}"
  "otp": "CODE",
  "realm": "email", // ou "sms" 
  "audience" : "{yourApiIdentifier}", // si vous avez besoin d’un jeton d’accès pour une API précise
  "scopes": "openid profile email" // les scopes dont vous avez besoin
}`;

<AuthCodeBlock children={codeExample} language="json" />

* Le type d’octroi est indiqué ici par `http://auth0.com/oauth/grant-type/passwordless/otp`.
* Les paramètres `client_id` et `username` sont inchangés.
* Le `client_secret` doit être fourni pour les <Tooltip tip="Client confidentiel : client (application) qui peut conserver des informations d’authentification de façon sécuritaire en utilisant un serveur backend de confiance. Par exemple, une application Web traditionnelle avec un backend sécurisé et une application machine-à-machine (M2M)." cta="Voir le glossaire" href="/docs/fr-ca/glossary?term=confidential+clients">clients confidentiels</Tooltip> (p. ex. les applications Web traditionnelles).
* Le mot de passe à usage unique doit être envoyé dans le paramètre `otp` au lieu du paramètre `password`.
* Le `realm` sert à identifier la connexion et remplace le paramètre `connection` des requêtes précédentes.
* Le paramètre `scope` est essentiellement le même, mais il n’accepte pas de valeurs non OIDC.
* Le paramètre `audience` peut être ajouté pour indiquer l’<Tooltip tip="Audience : identifiant unique de l’audience d’un jeton émis. Nommée aud dans un jeton, sa valeur contient l’ID d’une application (Client ID) pour un ID Token ou d’une API (API Identifier) pour un jeton d’accès." cta="Voir le glossaire" href="/docs/fr-ca/glossary?term=audience">audience</Tooltip> de l’API à laquelle le jeton sera destiné.

<div id="response-changes">
  ### Modifications des réponses
</div>

Les réponses de `/oauth/ro` avaient un format semblable à celui-ci :

```json lines theme={null}
{
  "access_token": "SlAV32hkKG",
  "token_type": "Bearer",
  "refresh_token": "8xLOxBtZp8",
  "expires_in": 3600,
  "id_token": "eyJ..."
}
```

* Le jeton d’accès renvoyé permet d’appeler le point de terminaison `/userinfo` (à condition que l’API indiquée par le paramètre `audience` utilise RS256 comme <Tooltip tip="Algorithme de signature : algorithme utilisé pour signer numériquement des jetons afin de garantir que le jeton n’a pas été altéré." cta="Voir le glossaire" href="/docs/fr-ca/glossary?term=signing+algorithm">algorithme de signature</Tooltip>) et, facultativement, l’API personnalisée si elle a été spécifiée.
* Le jeton d’identification sera signé d’office avec RS256 si un <Tooltip tip="Client public : client (application) qui ne peut pas conserver des informations d’identification de manière sécuritaire. Par exemple, une application native de bureau ou mobile et une application Web côté client basée sur JavaScript (comme une application monopage (SPA))." cta="Voir le glossaire" href="/docs/fr-ca/glossary?term=public+client">client public</Tooltip> en fait la demande.
* Un <Tooltip tip="Jeton d’actualisation : jeton utilisé pour obtenir un nouveau jeton d’accès sans obliger les utilisateurs à se connecter de nouveau." cta="Voir le glossaire" href="/docs/fr-ca/glossary?term=refresh+token">jeton d’actualisation</Tooltip> sera renvoyé seulement si le scope `offline_access` a été accordée et que l’API a l’option **Autoriser l’accès hors ligne** activée.

Voici un exemple de réponse conforme à OIDC provenant de `/oauth/token` :

```json lines theme={null}
{
  "access_token": "eyJ...",
  "token_type": "Bearer",
  "refresh_token": "8xLOxBtZp8",
  "expires_in": 3600,
  "id_token": "eyJ..."
}
```

<div id="code-changes-when-using-the-sdks">
  ### Modifications du code lors de l’utilisation des SDK
</div>

Si votre application utilise les bibliothèques natives Auth0 pour Android ou iOS, assurez-vous que la version de la bibliothèque incluse correspond au moins à la version minimale indiquée ci-dessous (ou à une version supérieure). Assurez-vous également de définir l’indicateur `OIDC Conformant` à `true` lors de la configuration des bibliothèques.

| Bibliothèque | Version minimale |
| ------------ | ---------------- |
| Android SDK  | 1.2              |
| Lock Android | 2.17             |
| Swift SDK    | 1.20.0           |
| Lock iOS     | 2.14.0           |

<div id="verify-migration">
  ### Vérifier la migration
</div>

1. Pour vérifier si vous utilisez le point de terminaison déprécié, consultez les [tenant logs](https://manage.auth0.com/#/logs), appliquez le filtre **Deprecation Notice**, puis recherchez les logs contenant `oauth/ro` **passwordless: This feature is being deprecated**. Vous pouvez aussi faire cette recherche directement avec la requête suivante : `type:depnote AND description:*passwordless*`.
2. Une fois votre base de code migrée et après vous être assuré que vos apps n’appellent plus ce point de terminaison, allez dans le [Dashboard](https://manage.auth0.com/#/tenant/advanced), sous **Tenant Settings > Advanced**.
3. Faites défiler jusqu’à **Migrations** et désactivez **Legacy** `/oauth/ro` **Endpoint**. La désactivation de ce commutateur désactive le point de terminaison déprécié pour votre tenant, ce qui empêche son utilisation.

Si la désactivation de ce commutateur entraîne des échecs de connexion, c’est signe qu’il reste encore du code hérité dans vos applications.

Une fois les migrations effectuées avec succès dans les environnements de production, le commutateur peut être désactivé et laissé ainsi afin de garantir que les fonctionnalités dépréciées ne puissent plus être utilisées.

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

* [Migrez votre flux propriétaire de la ressource Password](/docs/fr-ca/troubleshoot/product-lifecycle/past-migrations/migration-oauthro-oauthtoken)
