> ## Documentation Index
> Fetch the complete documentation index at: https://docs-dev-actions-triggers-prototype.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Utilisation des API sans mot de passe

> Décrit comment implémenter l’authentification sans mot de passe à l’aide des API Auth0.

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

Les API sans mot de passe peuvent être utilisées dans deux scénarios :

* Lors de l’implémentation de la connexion universelle et que vous souhaitez personnaliser la page de connexion à l’aide d’auth0.js pour interagir avec Auth0.
* Lorsque vous souhaitez intégrer le flux de connexion dans votre application.

Si vous décidez d’intégrer la connexion, assurez-vous que vous [comprenez les implications en matière de sécurité](/docs/fr-ca/authenticate/login/universal-vs-embedded-login).

Pour en savoir plus sur la façon d’implémenter la connexion sans mot de passe pour connexion universelle et la connexion intégrée pour différents scénarios, veuillez consulter [Authentification sans mot de passe avec la connexion universelle](/docs/fr-ca/authenticate/passwordless/implement-login/universal-login) ou [Authentification sans mot de passe avec la connexion intégrée](/docs/fr-ca/authenticate/passwordless/implement-login/embedded-login).

## Points de terminaison sans mot de passe

### POST /passwordless/start

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Vous devez activer l’autorisation **OTP Sans mot de passe** dans [Auth0 Dashboard > Applications > Applications](https://manage.auth0.com/#/applications) dans les paramètres de votre application, sous **Paramètres avancés** > **Types d’autorisations**.
</Callout>

Le point de terminaison [POST /passwordless/start](/docs/fr-ca/api/authentication#get-code-or-link) peut être appelé pour démarrer le processus d’authentification sans mot de passe pour la connexion classique et la connexion intégrée.

En fonction des paramètres fournis au point de terminaison, Auth0 démarre le processus de vérification de l’utilisateur en envoyant l’un des éléments suivants :

* Un code à usage unique par courriel ou SMS
* Un lien à usage unique par courriel

L’appel de l’API doit avoir la structure suivante :

export const codeExample1 = `POST https://{yourDomain}/passwordless/start
Content-Type: application/json
{
  "client_id": "{yourClientID}",
  "client_secret": "{yourClientSecret}", // For Regular Web Applications
  "connection": "email|sms",
  "email": "{email}", //set for connection=email
  "phone_number": "{phoneNumber}", //set for connection=sms
  "send": "link|code", //if left null defaults to link
  "authParams": { // any authentication parameters that you would like to add
    "scope": "openid",     // used when asking for a magic link
    "state": "{yourState}"  // used when asking for a magic link, or from the custom login page
  }
}`;

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

Si vous utilisez un lien magique, les utilisateurs recevront un lien généré par la Authentication API. Les utilisateurs sélectionneront le lien et déclencheront un appel à \{`yourLocataireAuth0}.auth0.com/passwordless/verify-redirect`. Auth0 redirigera l’utilisateur vers l’application et l’utilisateur sera connecté.

Si vous utilisez un code, votre application devra vous demander ce code, puis vous devrez utiliser le point de terminaison `/oauth/token`, ou la méthode `passwordlessLogin` dans la trousse SDK Auth0.js pour échanger ce code contre des jetons d’authentification.

### POST /oauth/token

Si vous implémentez une connexion sans mot de passe pour des applications natives ou des applications Web classiques, vous devez utiliser le point de terminaison `/oauth/token` pour échanger le code OTP contre des jetons d’authentification. Vous ne pouvez pas utiliser ce point de terminaison à partir d’applications à page unique.

Pour y parvenir, vous devez d’abord activer l’autorisation **<Tooltip href="/docs/fr-ca/glossary?term=passwordless" tip="Sans mot de passe
Forme d’authentification qui ne repose pas sur un mot de passe comme premier facteur." cta="Voir le glossaire">Passwordless</Tooltip> OTP (OTP Sans mot de passe)** dans [Auth0 Dashboard > Applications > Applications](https://manage.auth0.com/#/applications) dans les réglages de votre application, sous **Advanced Settings (Réglages avancés)** > **Grant Types (Types d’autorisations)**.

L’utilisateur recevra le code OTP et votre application native ou Web le lui demandera. Lorsque l’utilisateur saisit le code, vous pouvez terminer le flux d’authentification en appelant le point de terminaison `/oauth/token` avec les paramètres suivants :

export const codeExample2 = `POST https://{yourAuth0Domain}/oauth/token
Content-Type: application/json
{
  "grant_type" : "http://auth0.com/oauth/grant-type/passwordless/otp",
  "client_id": "{yourAuth0ClientID}",
  "client_secret": "{yourClientSecret}", // only for web apps, native apps don’t have a client secret
  "username":"<email address>", // or "<phone number>"
  "otp": "CODE",
  "realm": "email", // or "sms" 
  "audience" : "your-api-audience", // in case you need an access token for a specific API
  "scope": "openid profile email" // whatever scopes you need
}`;

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

Si tout se passe bien, Auth0 renverra une réponse similaire à la suivante :

```json lines theme={null}
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token":"eyJz93a...k4laUWw",
"refresh_token":"GEbRxBN...edjnXbL",
"id_token":"eyJ0XAi...4faeEoQ",
"token_type":"Bearer",
"expires_in":86400
}
```

Vous pouvez ensuite décoder le jeton d’ID pour obtenir des informations sur l’utilisateur ou utiliser le jeton d’accès pour appeler votre API comme d’habitude.

## Utiliser Auth0.js

Lors de la mise en œuvre de l’authentification sans mot de passe dans des applications à page unique ou dans une page de connexion universelle personnalisée, vous devez [utiliser Auth0.js et la méthode passwordlessLogin incluse](/docs/fr-ca/libraries/auth0js). L’implémentation est complexe, nous vous recommandons donc d’utiliser la bibliothèque plutôt que d’appeler directement les API.

## Limitation anti-attaques dans les points de terminaison sans mot de passe

Les limites d’utilisation et les fonctionnalités de protection Auth0 contre les attaques ne prennent en compte que l’adresse IP de la machine qui effectue l’appel API. Lorsque l’appel API est effectué à partir d’un serveur dorsal, vous souhaitez généralement qu’Auth0 prenne en compte l’adresse IP de l’utilisateur final, et non celle du serveur.

Auth0 prend en charge la spécification d’un en-tête `auth0-forwarded-for` dans les appels d’API, mais il n’est pris en compte que lorsque :

* l’appel API est effectué pour une application confidentielle.
* l’appel API inclut le secret client.
* la bascule **Faire confiance à l'IP indiqué dans l'entête du point de terminaison du jeton** est activée.

Pour une explication complète, veuillez consulter [Évitez les problèmes courants liés au flux de mot de passe du propriétaire de ressource et à la protection contre les attaques](/docs/fr-ca/get-started/authentication-and-authorization-flow/resource-owner-password-flow/avoid-common-issues-with-resource-owner-password-flow-and-attack-protection).
