Meilleures pratiques pour les bases de données personnalisées et l’exécution des scripts d’action

Un type de connexion à une base de données personnalisée vous permet de configurer des scripts d’action, qui contiennent le code personnalisé qu’Auth0 utilise pour assurer l’interface 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.

Conteneurs Webtask

Les scripts d’action s’exécutent dans un conteneur Webtask individuel avec une limite d’exécution d’environ 20 secondes. Après l’exécution des fonctions, le conteneur est recyclé.

Lorsqu’un conteneur est recyclé, il met fin aux opérations en cours du script d’action. Cela peut entraîner le retour d’une condition d’erreur et une réinitialisation potentielle de l’objet global. Pour plus d’informations sur l’objet global, lisez Meilleures pratiques de l’environnement des scripts d’action des bases de données personnalisées.

Fonctionnalités asynchrones

Les fonctions asynchrones de JavaScript, y compris les objets Promise et les fonctions async, sont prises en charge dans les scripts d’action.

Vous pouvez utiliser les fonctions 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 à toutes les opérations en attente, ce qui peut entraîner un comportement inattendu ou une erreur.

Si vous appelez un service externe ou une API dans votre script d’action, paramétrez la fonction pour qu’elle se termine après une durée raisonnable et renvoyez une erreur si le service externe ou l’API ne peut pas être atteint.

Exemples

Auth0 prend en charge l’utilisation d’objets Promise et de fonctions async dans les scripts d’action.

Objet Promise

Cet exemple utilise la méthode intégrée JavaScript fetch, qui obtient une ressource à partir d’un réseau et renvoie un objet Promise, écrit à l’aide de chaînes Promise.

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

Was this helpful?

/

Fonction asynchrone

Cet exemple utilise la méthode intégrée JavaScript fetch, qui obtient une ressource d’un réseau et renvoie un objet Promise, écrit à l’aide de fonctions asynchrones.

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

Was this helpful?

/

Fonction de rappel

La fonction callback signale que l’opération 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 un appel à la fonction callback, de préférence en utilisant explicitement l’instruction return.

Traitement asynchrone

Si un script d’action utilise un traitement asynchrone, la fonction callback doit être appelée après la fin de toutes les opérations asynchrones.

Paramètres

Si la fonction callback est appelée sans paramètre, elle sera exécutée comme si un paramètre null avait été fourni.

Taille

La taille totale de la mise en œuvre d’un script d’action ne doit pas dépasser 100 Ko. Cette limitation de taille exclut les modules importés npm. Pour plus d’informations sur les modules npm, lisez Meilleures pratiques de l’environnement des scripts d’action des bases de données personnalisées.

Plus la taille d’un script est importante, plus la latence est introduite en fonction du processus d’emballage et de transport utilisé par la plateforme Webtask. La taille a un impact sur les performances du système.

Fonctions anonymes

Les scripts d’action peuvent être mis en œuvre sous forme de fonctions anonymes, mais il n’est pas recommandé du faire. Les fonctions anonymes compliquent le débogage du script d’action et l’interprétation de la pile d’appels générée à la suite d’une condition d’erreur exceptionnelle. Pour en savoir plus sur les fonctions anonymes, lisez IIFE sur MDN Web Docs.

Gestion des erreurs

Transmettez un objet Error à la fonction callback avec un message descriptif de l’erreur :

return callback(new Error('My custom error message'));

Was this helpful?

/

Sécurité

Interface de base de données par rapport à une API

Veillez à sécuriser toutes les communications entre Auth0 et votre magasin d’identité hérité. Si votre magasin d’identité hérité n’a pas encore mis en œuvre une API, il est fortement recommandé de le faire.

Si votre magasin d’identité hérité dispose d’une API, vous pouvez enregistrer l’API via Auth0, et créer une Action pour restreindre l’accès des utilisateurs finaux.

Si votre magasin d’identité hérité ne dispose pas d’une API et qu’il n’est pas possible d’en mettre une en œuvre, vous pouvez toujours communiquer directement avec votre base de données. Veillez à ajouter les adresses IP d’Auth0 à la liste d’autorisations de votre pare-feu pour autoriser le trafic entrant en provenance d’Auth0.

Jetons de fournisseur d’identité

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 :

{
    "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
}

Was this helpful?

/

Si vous souhaitez récupérer l’une de ces propriétés avec le Management API Auth0, incluez la permission read:user_idp_tokens lorsque vous demandez un jeton d’accès.