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

# Migrez votre échange d’informations d’identification sans mot de passe du propriétaire de la ressource

> Décrit comment migrer les appels et les réponses de votre API sans mot de passe et les réponses de /oauth/ro à /oauth/token.

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) + "*****MASKED*****";
          }
          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>;
};

Un soutien pour le mot de passe du propriétaire a été ajouté à `/oauth/token`. L’utilisation de `/oauth/ro` comme point de terminaison est déconseillée depuis le 8 juillet 2017. Le point de terminaison `/oauth/ro` a été utilisé précédemment pour échanger des mots de passe à usage unique (OTP) reçus par l’utilisateur final du service de courriel ou SMS pour un jeton d’ID ou jeton d’accès. Auth0 a mis en place une nouvelle API qui remplace `/oauth/ro` pour cette utilisation et nous vous recommandons d’effectuer votre migration en utilisant ce nouveau point de terminaison.

## Caractéristiques affectées

Cette modification vous concerne si vous utilisez l’échange d’informations d’identification sans mot de passe du propriétaire de la ressource et appelez `/oauth/ro` directement sans utiliser de bibliothèques ou de trousses SDK Auth0.

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Lorsque le jeton d’accès d’un utilisateur basé sur `/oauth/ro` a expiré, Auth0 force l’utilisateur à se réauthentifier (déconnexion forcée requise), car le jeton d’actualisation `/oauth/ro` ne peut pas être utilisé pour appeler `/oauth/token` en vue d’obtenir un nouveau jeton d’accès. Tous les utilisateurs actuellement connectés doivent se connecter à nouveau lors d’une migration `/oauth/ro` vers `/oauth/token`.
</Callout>

## Actions

### Demander des modifications

Auparavant, la charge utile d’une requête vers `/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 implémentation :

* Le point de terminaison pour exécuter les échanges de jetons est désormais `/oauth/token`.
* Le type d’autorisation propre à Auth0 est utilisé pour authentifier les utilisateurs à partir d’une connexion (ou d’une partition) spécifique.
* Auth0 prend en charge les permissions OIDC standard, ainsi que les permissions que vous avez définies dans votre API personnalisée.
* Une permission qui ne s’inscrit pas dans l’une de ces catégories, comme `favorite_color` ci-dessus, n’est plus une permission valide.
* Le paramètre `device` a été retiré.
* Le paramètre `audience` est facultatif.

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

export const codeExample = `{
  "grant_type" : "http://auth0.com/oauth/grant-type/passwordless/otp",
  "client_id": "{yourClientId}",
  "client_secret": "{yourClientSecret}", // only for web apps, native apps don’t have a client secret
  "username": "{userEmailAddress}", // or "{userPhoneNumber}"
  "otp": "CODE",
  "realm": "email", // or "sms" 
  "audience" : "{yourApiIdentifier}", // in case you need an access token for a specific API
  "scopes": "openid profile email" // whatever scopes you need
}`;

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

* Le type d’autorisation est spécifié ici comme `http://auth0.com/oauth/grant-type/passwordless/otp`.
* Les paramètres `client_id` et `username` sont inchangés.
* Le `client_secret` doit être spécifié pour les clients confidentiels (par exemple, les applications Web classiques).
* Le mot de passe à usage unique doit être envoyé dans le paramètre `otp` au lieu du paramètre `password`.
* Le `realm` est utilisé pour identifier la connexion et remplace le paramètre `connection` des appels précédents.
* Le paramètre `scope` est sensiblement le même, mais il n’accepte pas les valeurs non OIDC.
* Le paramètre `audience` peut être ajouté et indique le type d’<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" tip="">audience</Tooltip> de l’API auquel le jeton est destiné.

### Changements dans les réponses

Les réponses provenant de `/oauth/ro` avait un format similaire à 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é est valide pour appeler le point de terminaison  `/userinfo` (à condition que l’API spécifiée par le paramètre `audience` utilise RS256 comme algorithme de signature) et éventuellement l’API personnalisée si elle a été spécifiée.
* Le jeton d’ID sera signé de force à l’aide de l’algorithme RS256 si un client public en fait la demande.
* Un jeton d’actualisation sera renvoyé seulement si la permission `offline_access` a été octroyée et que l’option **Autoriser l’accès hors ligne** est activée dans l’API.

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..."
}
```

### Modifications du code lors de l’utilisation des trousses SDK

Si votre application utilise les bibliothèques natives Auth0 pour Android ou iOS, assurez-vous que la version de la bibliothèque que vous incluez est au moins égale au minimum répertorié ci-dessous (ou supérieure). Assurez-vous également de définir le drapeau `OIDC Conformant` sur `true` lors de la configuration des bibliothèques.

| Bibliothèque             | Version Minimum |
| ------------------------ | --------------- |
| Trousse SDK pour Android | 1.2             |
| Lock Android             | 2.17            |
| Trousse SDK pour Swift   | 1.20.0          |
| Lock iOS                 | 2.14.0          |

### Vérifier la migration

1. Pour vérifier si vous utilisez le point de terminaison obsolète, vérifiez le filtre [tenant logs](https://manage.auth0.com/#/logs), par **Deprecation Notice (Avis d’obsolescence)** et puis vérifiez les journaux indiquant `oauth/ro` **sans mot de passe : Cette fonctionnalité est en cours d’abandon**. Vous pouvez également effectuer cette recherche directement en utilisant la requête suivante : `type:depnote AND description:*passwordless*`.
2. Une fois que vous avez migré votre base de code et que vous avez la certitude que vos applications ne sont pas en train d’appeler le point de terminaison, accédez à [Dashboard](https://manage.auth0.com/#/tenant/advanced)  sous **Tenant Settings (Paramètres du locataire) > Advanced (Avancés)**.
3. Faites défiler vers le bas jusqu’à **Migrations** et désactivez **Hérité**`/oauth/ro` **Point de terminaison**. Ce bouton à bascule permet de désactiver le point de terminaison obsolète pour votre locataire, et empêche ainsi toute utilisation ultérieure.

Si la désactivation du commutateur entraîne des échecs de connexion, c’est le signe que vous n’avez pas encore supprimé toutes les instances de code hérité de vos applications.

Une fois que les migrations ont bien été effectuées dans les environnements de production, le commutateur peut être désactivé et ignoré, afin de s’assurer que les fonctionnalités obsolètes ne peuvent plus être utilisées.

## En savoir plus

* [Migration du Flux de mot de passe du propriétaire de ressource](/docs/fr-ca/troubleshoot/product-lifecycle/past-migrations/migration-oauthro-oauthtoken)
