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

> Découvrez comment migrer vers Actions à partir de Rules, Hooks et des versions antérieures d’Actions.

# Migrer de la version bêta d’Actions à la version finale

Dans le cadre de notre vision à long terme pour l’extensibilité d’Auth0 au moyen de code personnalisé, nous avons affiné et simplifié les modèles de programmation introduits pendant la période bêta d’Actions. La création d’Actions se fait désormais de façon plus cohérente et plus prévisible dans l’ensemble des Triggers. Les données d’événement sont maintenant davantage alignées sur l’[Auth0 Management API](https://auth0.com/docs/api/management/v2) et sur d’autres aspects de la plateforme Auth0. La modification du comportement de la transaction au moyen de code personnalisé s’effectue désormais toujours en appelant des méthodes d’un nouvel argument `api`.

La migration d’une Action créée avant la [disponibilité générale (GA)](/docs/fr-CA/troubleshoot/product-lifecycle/product-release-stages#general-availability) devrait généralement suivre les étapes suivantes :

1. Ajustez les références aux propriétés d’événement renommées et déplacées, comme indiqué dans la section [Modifications majeures](#breaking-changes).
2. Au lieu de composer et de retourner un objet décrivant les effets secondaires souhaités, mettez à jour le code personnalisé pour appeler la méthode `api` pertinente, comme indiqué dans la section [Exécution d’effets secondaires](#performing-side-effects).
3. Pour les Actions qui doivent gérer les callbacks de redirection, utilisez la nouvelle fonction dédiée exposée. Si vous utilisiez du code qui reposait sur `event.protocol === 'redirect-callback'`, consultez la page [Redirection avec Actions](/docs/fr-CA/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/redirect-with-actions).

<div id="breaking-changes">
  ## Changements non rétrocompatibles
</div>

<div id="query-and-body-parameters">
  ### Paramètres de requête et de corps
</div>

L'accès direct aux paramètres de requête et de corps est disponible à l'aide des objets `event.request.query` et `event.request.body`. Ceux-ci sont exposés que l'autorisation ait été initiée via une requête `GET` ou `POST`. De nombreux paramètres de requête ou de corps spécifiques au protocole envoyés dans le cadre d'une requête d'autorisation sont maintenant également disponibles en tant que valeurs de premier niveau sur l'objet `event.transaction`. Nous recommandons d'utiliser `event.transaction` plutôt que `event.request.query` et `event.request.body`, à moins que votre cas d'utilisation ne soit pas pris en charge. Une correspondance complète de ces changements se trouve ci-dessous :

<table class="table">
  <thead>
    <tr>
      <th>Propriété pré-GA</th>
      <th>Propriété GA</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td><code>event.actor.ip</code></td>
      <td><code>event.request.ip</code></td>
    </tr>

    <tr>
      <td><code>event.actor.hostname</code></td>
      <td><code>event.request.hostname</code></td>
    </tr>

    <tr>
      <td><code>event.actor.geoIp</code></td>
      <td><code>event.request.geoip</code></td>
    </tr>

    <tr>
      <td><code>event.actor.language</code></td>
      <td><code>event.request.language</code></td>
    </tr>

    <tr>
      <td><code>event.actor.method</code></td>
      <td><code>event.request.method</code></td>
    </tr>

    <tr>
      <td><code>event.actor.userAgent</code></td>
      <td><code>event.request.user\_agent</code></td>
    </tr>

    <tr>
      <td><code>event.actor.body</code></td>
      <td><code>event.request.body</code></td>
    </tr>

    <tr>
      <td><code>event.actor.query</code></td>
      <td><code>event.request.query</code></td>
    </tr>

    <tr>
      <td><code>event.actor.query.audience</code></td>
      <td><code>event.resource\_server.identifier</code></td>
    </tr>

    <tr>
      <td><code>event.actor.query.scope</code></td>
      <td><code>event.transaction.requested\_scopes</code></td>
    </tr>

    <tr>
      <td><code>event.actor.query.acr\_values</code></td>
      <td><code>event.transaction.acr\_values</code></td>
    </tr>

    <tr>
      <td><code>event.actor.query.ui\_locales</code></td>
      <td><code>event.transaction.ui\_locales</code></td>
    </tr>

    <tr>
      <td><code>event.protocol</code></td>
      <td><code>event.transaction.protocol</code></td>
    </tr>

    <tr>
      <td><code>context.secrets</code></td>
      <td><code>event.secrets</code></td>
    </tr>
  </tbody>
</table>

<div id="user-profile-properties">
  ### Propriétés du profil utilisateur
</div>

En général, les propriétés de l’objet `event.user` sont passées du camel case au snake case afin de correspondre à la [structure du profil utilisateur Auth0](/docs/fr-CA/manage-users/user-accounts/user-profiles/user-profile-structure). Par exemple, `event.user.appMetadata` a été modifiée en `event.user.app_metadata`.

<div id="performing-side-effects">
  ### Gestion des effets secondaires
</div>

Dans la version pré-GA du déclencheur post-login, les effets secondaires étaient exécutés en renvoyant un objet à partir d'une Action. Dans Actions GA, un objet `api` est fourni pour encapsuler ces modifications et offrir de meilleures suggestions de types et une documentation intégrée directement dans l'éditeur.

<div id="update-user-user_metadata">
  #### Mettre à jour la propriété user\_metadata de l'utilisateur
</div>

Déclencheur pré-GA :

```js lines theme={null}
async function myFunction(event, context) {
  return {
    user: {
      userMetadata: {
        myParam: "foo"
      }
    }
  };
}
```

Déclencheur GA :

```js lines theme={null}
async function onExecutePostLogin(event, api) {
  api.user.setUserMetadata('myParam', 'foo');
}
```

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Vous ne devriez pas utiliser cette méthode dans les callbacks, car son invocation ne met pas immédiatement à jour les métadonnées. En revanche, vous pouvez appeler cette méthode plusieurs fois dans différentes Actions au sein du même flux (les métadonnées définies dans une Action sont appliquées à l'objet transitoire et sont donc disponibles dans les Actions suivantes), et le moteur regroupera les modifications et mettra à jour les métadonnées en une seule fois avant la fin du flux.
</Callout>

<div id="update-user-app_metadata">
  #### Mettre à jour app\_metadata de l'utilisateur
</div>

Déclencheur pré-GA :

```js lines theme={null}
async function myFunction(event, context) {
  return {
    user: {
      appMetadata: {
        myParam: "foo"
      }
    }
  };
}
```

Déclencheur GA :

```js lines theme={null}
async function onExecutePostLogin(event, api) {
  api.user.setAppMetadata('myParam', 'foo');
}
```

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Vous ne devriez pas utiliser cette méthode dans les callbacks, car l’invoquer ne mettra pas immédiatement à jour les métadonnées. Au lieu de cela, vous pouvez appeler cette méthode plusieurs fois dans différentes Actions au sein du même flux (les métadonnées définies dans une Action sont appliquées à l’objet transitoire et sont donc disponibles dans les Actions suivantes), et le moteur regroupera les modifications et mettra à jour toutes les métadonnées en une seule fois avant la fin du flux.
</Callout>

<div id="deny-a-login">
  ### Refuser une tentative de connexion
</div>

Déclencheur pré-GA :

```js lines theme={null}
async function myFunction(event, context) {
  throw new Error("Accès refusé.");
}
```

Déclencheur GA :

```js lines theme={null}
async function onExecutePostLogin(event, api) {
  api.access.deny("Accès refusé.");
}
```

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Générer une erreur refusera également une connexion, mais appeler `api.access.deny` est l'approche recommandée.
</Callout>

<div id="add-custom-claims-to-the-access-token">
  ### Ajouter des revendications personnalisées au jeton d'accès
</div>

Déclencheur avant la GA :

```js lines theme={null}
async function myFunc(event, context) {
  return {
    accessToken: {
      customClaims: {
        'https://example.com/custom/claim': 'Custom claim value',
      }
    }
  };
}
```

Déclencheur GA :

```js lines theme={null}
async function myFunc(event, api) {
  api.accessToken.setCustomClaim('https://example.com/custom/claim', 'Custom claim value');
}
```

<div id="add-custom-claims-to-the-id-token">
  ### Ajouter des déclarations personnalisées au jeton ID
</div>

Déclencheur avant la disponibilité générale (GA) :

```js lines theme={null}
async function myFunc(event, context) {
  return {
    idToken: {
      customClaims: {
        'https://example.com/custom/claim': 'Valeur de revendication personnalisée',
      }
    }
  };
}
```

Déclencheur GA :

```js lines theme={null}
async function myFunc(event, api) {
  api.idToken.setCustomClaim('https://example.com/custom/claim', 'Custom claim value');
}
```

<div id="dynamically-enable-multi-factor-authentication">
  ### Activer dynamiquement l’authentification multifacteur
</div>

Déclencheur pré‑GA :

```js lines theme={null}
async function myFunction(event, context) {
  return {
    command: {
      type: "multifactor",
      provider: "any"
    }
  };
}
```

Déclencheur GA :

```js lines theme={null}
async function onExecutePostLogin(event, api) {
  api.multifactor.enable("duo");
}
```

<div id="redirect-the-user">
  ### Rediriger l'utilisateur
</div>

Déclencheur avant la disponibilité générale :

```js lines theme={null}
async function myFunction(event, context) {
  return {
    command: {
      type: "redirect",
      url: "https://my-app.example.com"
    }
  };
}
```

Déclencheur GA :

```js lines theme={null}
async function onExecutePostLogin(event, api) {
  api.redirect.sendUserTo("https://my-app.example.com");
}
```

Pour veiller à ce que les paramètres soient envoyés de façon sécuritaire et pour éviter les attaques par rejeu, la transmission de données par redirection a considérablement changé dans la version GA d’Actions. Pour en savoir plus, consultez [Redirection avec Actions](/docs/fr-CA/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/redirect-with-actions).

<div id="manipulate-scopes">
  ### Manipuler les scopes
</div>

Même si nous avons testé la possibilité de permettre la manipulation directe des scopes des jetons d’ID et des <Tooltip tip="Jeton d’accès : justificatif d’autorisation sous la forme d’une chaîne opaque ou d’un JWT, utilisé pour accéder à une API." cta="Afficher le glossaire" href="/docs/fr-CA/glossary?term=Access+Token">Access Token</Tooltip> pendant la version bêta des Actions, nous ne prenons pas en charge cette fonctionnalité dans la version GA des Actions.
