> ## 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écouvrez les pratiques exemplaires pour l’exécution des scripts d’action de base de données personnalisée.

# Pratiques exemplaires pour l’exécution des scripts d’action de base de données personnalisée

Un type de connexion de base de données personnalisée vous permet de configurer des scripts d’action, qui contiennent du code personnalisé utilisé par Auth0 pour s’interfacer avec votre magasin d’identité hérité. Les scripts d’action sont des fonctions JavaScript nommées qui acceptent un ensemble prédéfini de paramètres.

<div id="webtask-containers">
  ## Conteneurs Webtask
</div>

Les scripts d’action s’exécutent dans un conteneur Webtask distinct, avec une limite d’exécution d’environ 20 secondes. Une fois les fonctions exécutées, le conteneur est recyclé.

Lorsqu’un conteneur est recyclé, il met fin aux opérations en attente du script d’action. Cela peut entraîner le retour d’une erreur et la réinitialisation possible de l’objet `global`. Pour en savoir plus sur l’objet `global`, consultez [Pratiques exemplaires pour l’environnement des scripts d’action de base de données personnalisée](/fr-CA/docs/authenticate/database-connections/custom-db/custom-database-connections-scripts/environment).

<div id="asynchronous-features">
  ## Fonctionnalités asynchrones
</div>

Les fonctionnalités asynchrones de JavaScript, y compris les objets [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) et les [fonctions async](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function), sont prises en charge dans les scripts d’action.

Vous pouvez utiliser les fonctionnalités asynchrones pour exécuter des opérations non bloquantes dans un script d’action, mais assurez-vous que ces opérations ne dépassent pas la limite d’exécution du conteneur Webtask. Lorsque le conteneur Webtask est recyclé, il met fin à toute opération en attente, ce qui peut entraîner un comportement inattendu ou une erreur.

Si vous effectuez un appel à un service externe ou à une API dans votre script d’action, définissez un délai d’expiration raisonnable pour la fonction, puis [renvoyez une erreur](#error-handling) si le service externe ou l’API est inaccessible.

<div id="examples">
  ### Exemples
</div>

Auth0 prend en charge l’utilisation d’objets [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) et de [fonctions async](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function) dans les scripts d’action.

<div id="promise-object">
  #### Objet Promise
</div>

Cet exemple utilise la méthode JavaScript intégrée `fetch`, qui récupère une ressource depuis le réseau, puis renvoie un objet Promise. Il est présenté à l’aide d’un [chaînage de promesses](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#chaining).

```javascript lines expandable theme={null}
function login(userNameOrEmail, password, callback) {
	const hashedPassword = hash(password);
	const apiEndpoint = 'https://example.com/api/authenticate';
	const options = {
		method: 'POST',
		body: {
			email: userNameOrEmail,
			password: hashedPassword
		}
	};

	fetch(apiEndpoint, options) 
		.then((response) => {
			if (!response.ok) {
				return callback(new Error(`HTTP error! Status: ${response.status}`));
			}

			return response.json();
		})
		.then((response) => {
			if (response.err) {
				return callback(new Error(`Error authenticating user: ${err}`));
			}

			let profile = {
				email: response.profileData.email,
				username: response.profileData.username
			};

			return callback(null, profile);
		})
		.catch((err) => {
			return callback(new Error(`An error occurred: ${err}`));
		});
  }
```

<div id="async-function">
  #### Fonction asynchrone
</div>

Cet exemple utilise la méthode JavaScript intégrée `fetch`, qui récupère une ressource sur le réseau et renvoie un objet Promise. Il est rédigé à l’aide de [fonctions asynchrones](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function).

```js lines expandable theme={null}
async function login(userNameOrEmail, password, callback) {
	const hashedPassword = hash(password);
	const apiEndpoint = 'https://example.com/api/authenticate';
	const options = {
		method: 'POST',
		body: {
			email: userNameOrEmail,
			password: hashedPassword
		}
	};

	const response = await fetch(apiEndpoint, options);

	if (!response.ok) {
		return callback(new Error(`HTTP error! Status: ${response.status}`));
	}

	const result = response.json();

	if (result.err) {
		return callback(new Error(`Error authenticating user: ${err}`));
	}

	let profile = {
		email: response.profileData.email,
		username: response.profileData.username
	};

	return callback(null, profile);
}
```

<div id="callback-function">
  ## Fonction de rappel
</div>

La fonction `callback` indique que l’exécution du script d’action est terminée et doit être appelée exactement une fois. Un script d’action doit se terminer immédiatement après l’appel à la fonction `callback`, de préférence en utilisant explicitement l’instruction `return`.

<Warning>
  Si la fonction `callback` est appelée plus d’une fois, cela peut entraîner des résultats inattendus ou des erreurs.

  Si la fonction `callback` n’est jamais appelée, l’exécution du script d’action se bloquera et une erreur sera renvoyée lorsque le conteneur Webtask sera recyclé.
</Warning>

<div id="asynchronous-processing">
  ### Traitement asynchrone
</div>

Si un script d’action utilise un traitement asynchrone, la fonction `callback` doit être appelée seulement une fois toutes les opérations asynchrones terminées.

<div id="parameters">
  ### Paramètres
</div>

Si la fonction `callback` est appelée sans aucun paramètre, elle s’exécute comme si un paramètre `null` avait été fourni.

<div id="size">
  ## Taille
</div>

La taille totale de l’implémentation de tout script d’action ne doit pas dépasser 100 kB. Cette limite n’inclut pas les modules `npm` importés. Pour en savoir plus sur les modules `npm`, consultez [Pratiques exemplaires pour l’environnement des scripts Action de base de données personnalisée](/fr-CA/docs/authenticate/database-connections/custom-db/custom-database-connections-scripts/environment).

Plus un script est volumineux, plus le processus d’empaquetage et de transport utilisé par la plateforme Webtask ajoute de la latence. La taille a une incidence sur les performances du système.

<div id="anonymous-functions">
  ## Fonctions anonymes
</div>

Les scripts d’action peuvent être écrits sous forme de fonctions anonymes, mais ce n’est pas recommandé. Les fonctions anonymes rendent plus difficile le débogage du script d’action et l’interprétation de la pile d’appels générée en cas d’exception. Pour en savoir plus sur les fonctions anonymes, consultez [IIFE sur MDN Web Docs](https://developer.mozilla.org/en-US/docs/Glossary/IIFE).

<div id="error-handling">
  ## Gestion des erreurs
</div>

Transmettez un objet `Error` à la fonction `callback`, accompagné d’un message décrivant l’erreur :

```js lines theme={null}
return callback(new Error('My custom error message'));
```

<div id="security">
  ## Sécurité
</div>

<div id="database-interface-vs-api">
  ### Interface de base de données ou API
</div>

Veillez à sécuriser toutes les communications entre Auth0 et votre magasin d’identités hérité. Si votre magasin d’identités hérité ne dispose pas déjà d’une API, il est fortement recommandé d’en implémenter une.

Si votre magasin d’identités hérité dispose d’une API, vous pouvez [enregistrer l’API](/fr-CA/docs/get-started/auth0-overview/set-up-apis) auprès d’Auth0 et [créer une Action](/fr-CA/docs/manage-users/access-control/sample-use-cases-actions-with-authorization#deny-access-to-anyone-calling-an-api) pour restreindre l’accès aux utilisateurs finaux.

Si votre magasin d’identités hérité ne dispose pas d’une API — et qu’il n’est pas possible d’en implémenter une — vous pouvez tout de même communiquer directement avec votre base de données. Assurez-vous d’[ajouter les adresses IP d’Auth0 à la liste d’autorisation de votre pare-feu](/fr-CA/docs/secure/security-guidance/data-security/allowlist) pour autoriser le trafic entrant provenant d’Auth0.

<div id="identity-provider-tokens">
  ## Jetons du fournisseur d’identité
</div>

Si l’objet `user` renvoie les propriétés `access_token` et `refresh_token`, Auth0 les traite différemment des autres types d’informations utilisateur. Auth0 les stocke dans la propriété `identities` de l’objet `user` :

```json lines theme={null}
{
	"email": "you@example.com",
	"updated_at": "2019-03-15T15:56:44.577Z",
	"user_id": "auth0|some_unique_id",
	"nickname": "a_nick_name",
	"identities": [ 
		{
			"user_id": "some_unique_id",
			"access_token": "e1b5.................92ba",
			"refresh_token": "a90c.................620b",
			"provider": "auth0", 
			"connection": "custom_db_name",
			"isSocial": false 
		}
  ], 
  "created_at": "2019-03-15T15:56:44.577Z",
  "last_ip": "192.168.1.1",
  "last_login": "2019-03-15T15:56:44.576Z",
  "logins_count": 3
}
```

Si vous voulez récupérer l’une de ces deux propriétés avec le <Tooltip tip="Management API : un produit permettant aux clients d’effectuer des tâches administratives." cta="Voir le glossaire" href="/fr-CA/docs/glossary?term=Management+API">Management API</Tooltip> d’Auth0, incluez le scope `read:user_idp_tokens` lorsque vous [demandez un Jeton d’accès](/fr-CA/docs/secure/tokens/access-tokens/management-api-access-tokens/get-management-api-access-tokens-for-production).
