Passer au contenu principal
Le déclencheur Login s’exécute lorsqu’un utilisateur s’authentifie avec succès auprès d’une application dans un locataire Auth0. Cela comprend également l’authentification après l’inscription.
Schéma illustrant le flux de connexion des Actions.
Les Actions de ce déclencheur sont bloquantes (synchrones), ce qui signifie qu’elles s’exécutent dans le cadre du processus du déclencheur et empêchent le reste du pipeline Auth0 de s’exécuter tant que l’Action n’est pas terminée.

Déclencheurs

Login / Après la connexion

Le déclencheur post-login est une fonction exécutée après la connexion d’un utilisateur et lorsqu’un est échangé.

Références

  • Objet d’événement : Contient des renseignements contextuels sur un utilisateur qui se connecte à Auth0.
  • Objet API : Contient des méthodes permettant de modifier le comportement du flux.

Cas d’utilisation courants

Contrôle d’accès

Une Action post-login peut servir à appliquer une logique personnalisée pour refuser l’accès à un utilisateur qui tente d’accéder à une application :
/**
 * @param {Event} event - Détails sur l'utilisateur et le contexte dans lequel il se connecte.
 * @param {PostLoginAPI} api - Interface dont les méthodes peuvent être utilisées pour modifier le comportement de la connexion.
 */
exports.onExecutePostLogin = async (event, api) => {
  if (event.user.email && event.user.email.endsWith("@example.com") && event.client.name === "My SPA") {
    api.access.deny(`Access to ${event.client.name} is not allowed.`);
  }
};

Autoriser l’accès à une application donnée uniquement les jours de semaine

Si vous avez une application à laquelle vous voulez autoriser l’accès uniquement les jours de semaine, vous pouvez créer l’Action suivante :
/**
 * @param {Event} event - Détails sur l'utilisateur et le contexte dans lequel il se connecte.
 * @param {PostLoginAPI} api - Interface dont les méthodes peuvent être utilisées pour modifier le comportement de la connexion.
 */
 exports.onExecutePostLogin = async (event, api) => {
  if (event.client.name === "APP_NAME") {
    const d = new Date().getDay();

    if (d === 0 || d === 6) {
      api.access.deny("This app is only available during the week.");
    }
  }
}

Refuser l’accès à quiconque appelle une API

Supposons que vous souhaitiez refuser l’accès à tous les utilisateurs qui appellent une API. Cela signifie que vous devez refuser l’accès en fonction de la valeur de l’ de votre API, que vous trouverez dans le champ API Audience de votre API dans Auth0 Dashboard > Applications > APIs. Pour ce faire, vous créeriez l’Action suivante :
/**
 * @param {Event} event - Détails sur l'utilisateur et le contexte dans lequel il se connecte.
 * @param {PostLoginAPI} api - Interface dont les méthodes peuvent être utilisées pour modifier le comportement de la connexion.
 */
 exports.onExecutePostLogin = async (event, api) => {
  // Dans Actions, une API est désignée comme un serveur de ressources (Resource Server).
  if (event.resource_server && event.resource_server.identifier === "http://todoapi2.api") {
    api.access.deny("end_users_not_allowed");
  }
}

Ajouter les rôles utilisateur aux jetons d’identification et d’accès

Pour ajouter des rôles utilisateur aux jetons émis par Auth0, utilisez l’objet event.authorization ainsi que les méthodes api.idToken.setCustomClaim et api.accessToken.setCustomClaim :
/**
 * @param {Event} event - Détails sur l'utilisateur et le contexte dans lequel il se connecte.
 * @param {PostLoginAPI} api - Interface dont les méthodes peuvent être utilisées pour modifier le comportement de la connexion.
 */
exports.onExecutePostLogin = async (event, api) => {
  const namespace = 'https://my-app.example.com';
  if (event.authorization) {
    api.idToken.setCustomClaim(`${namespace}/roles`, event.authorization.roles);
    api.accessToken.setCustomClaim(`${namespace}/roles`, event.authorization.roles);
  }
}
  • Une revendication personnalisée ne peut pas inclure certains termes, et nous vous recommandons fortement d’utiliser une revendication avec espace de noms sous la forme d’un URI. Consultez notre documentation sur les revendications personnalisées pour en savoir plus.
  • Le renvoyé à l’application qui effectue la demande est généré et signé à la fin du traitement du déclencheur. Le JWT final signé n’est pas accessible dans une Action.

Enrichir le profil de l’utilisateur

Auth0 fournit un système permettant de stocker des métadonnées dans un profil utilisateur. Pour définir user_metadata ou app_metadata dans le profil d’un utilisateur au moment de sa connexion, utilisez les fonctions api.user.setUserMetadata ou api.user.setAppMetadata.
/**
 * @param {Event} event - Détails sur l'utilisateur et le contexte dans lequel il se connecte.
 * @param {PostLoginAPI} api - Interface dont les méthodes peuvent être utilisées pour modifier le comportement de la connexion.
 */
exports.onExecutePostLogin = async (event, api) => {
  api.user.setUserMetadata("favorite_color", "blue");
};
Une fois toutes les Actions post-login exécutées, Actions mettra à jour le profil de l’utilisateur en une seule opération. Cette opération est soumise à la “Write Users” limite de débit.

Imposer une stratégie MFA personnalisée

Une Action post-login peut être utilisée pour exiger dynamiquement la pour un utilisateur, en fonction des besoins de votre application.
/**
 * @param {Event} event - Détails sur l'utilisateur et le contexte dans lequel il se connecte.
 * @param {PostLoginAPI} api - Interface dont les méthodes peuvent être utilisées pour modifier le comportement de la connexion.
 */
exports.onExecutePostLogin = async (event, api) => {
  // Exiger la MFA pour tout utilisateur se connectant depuis l'Amérique du Nord.
  if (event.request.geoip.continentCode === "NA") {
    api.multifactor.enable("any");
  };
};
Un fournisseur MFA doit être configuré pour activer la MFA au moment de la connexion. Pour en savoir plus, consultez Authentification multifacteur.

Réduire les frictions grâce aux clés d’accès

Une Action post-login peut être utilisée pour réduire les frictions en n’exigeant pas dynamiquement la MFA pour un utilisateur qui s’est authentifié à l’aide d’une clé d’accès.
/**
* Gestionnaire qui sera appelé lors de l'exécution d'un flux PostLogin.
*
* @param {Event} event - Détails sur l'utilisateur et le contexte dans lequel il se connecte.
* @param {PostLoginAPI} api - Interface dont les méthodes peuvent être utilisées pour modifier le comportement de la connexion.
*/
exports.onExecutePostLogin = async (event, api) => {
 // Vérifier si une clé d'accès a été utilisée pour s'authentifier
 const skipMFA = event.authentication?.methods.some(
   (method) => method.name === "passkey"
 );

 // Si une clé d'accès a été utilisée, ignorer le MFA
 if (skipMFA) {
   api.multifactor.enable("none");
 }
};
La connexion doit être configurée avec les clés d’accès et la MFA activées. Pour en savoir plus, consultez Passkeys et l’authentification multifacteur.

Rediriger l’utilisateur vers un site externe

Comme pour les Rules de redirection, une Action post-login peut servir à rediriger l’utilisateur vers un site externe. Une fois l’opération terminée, l’utilisateur peut être redirigé vers Auth0 pour continuer son flux de connexion. Dans l’exemple ci-dessous, une Action de redirection est utilisée pour demander à l’utilisateur d’indiquer sa couleur préférée.
/**
 * @param {Event} event - Détails sur l'utilisateur et le contexte dans lequel il se connecte.
 * @param {PostLoginAPI} api - Interface dont les méthodes peuvent être utilisées pour modifier le comportement de la connexion.
 */
exports.onExecutePostLogin = async (event, api) => {
  // Ignorer la redirection si l'utilisateur a déjà choisi une couleur préférée.
  if (event.user.user_metadata.favorite_color) {
    return;
  }

  const token = api.redirect.encodeToken({
    secret: event.secrets.MY_SHARED_SECRET,
    payload: {
      email: event.user.email,
    },
  });

  // Rediriger l'utilisateur vers https://my-app.example.com
  // avec le paramètre de chaîne de requête `session_token`.
  api.redirect.sendUserTo("https://my-app.example.com", { 
    query: { session_token: token }
  });
};

/**
 * @param {Event} event - Détails sur l'utilisateur et le contexte dans lequel il se connecte.
 * @param {PostLoginAPI} api - Interface dont les méthodes peuvent être utilisées pour modifier le comportement de la connexion.
 */
exports.onContinuePostLogin = async (event, api) => {
  // Une fois le point de terminaison /continue appelé, extraire le jeton signé
  // et stocker la couleur préférée dans les métadonnées de l'utilisateur.

  const payload = api.redirect.validateToken({
    secret: event.secrets.MY_SHARED_SECRET,
  });

  api.user.setUserMetadata("favorite_color", payload.favorite_color);
};
Le pipeline Actions sera suspendu pendant que l’utilisateur est redirigé. Une fois que l’utilisateur reprend son processus de connexion à Auth0, le pipeline Actions reprendra là où il a été suspendu. Les Actions exécutées avant la redirection ne seront pas exécutées de nouveau. Pour en savoir plus sur les Redirect Actions, consultez Redirect with Actions.

Modifier les scopes d’un jeton d’accès

Lorsque vous modifiez les scopes associés à un , veillez à respecter les bonnes pratiques en matière de spécification de l’audience.
  • Vérifiez toujours l’audience attendue avant d’ajouter des scopes.
  • N’utilisez pas d’entrées non fiables pour ajouter des scopes.
/**
 * @param {Event} event - Détails sur l'utilisateur et le contexte dans lequel il se connecte.
 * @param {PostLoginAPI} api - Interface dont les méthodes peuvent être utilisées pour modifier le comportement de la connexion.
 */
exports.onExecutePostLogin = async (event, api) => {
  if (event?.resource_server?.identifier === 'https://example.com/api') {
    api.accessToken.addScope("read:xyz");
  }
};

Refuser l’accès pour des empreintes JA3/JA4 spécifiques

L’objet event.security_context contient les valeurs d’empreinte JA3/JA4 pour la transaction en cours.
exports.onExecutePreUserRegistration = async (event, api) => {
  const clientJa4 = event?.security_context?.ja4;
  console.log('[ACTION]', {clientJa4});
  const badFingerprints = ['t13d1517h2_8daaf6152771_b6f405a00624','t13d1516h2_8daaf6152771_d8a2da3f94cd'];
  if (clientJa4 && badFingerprints.includes(clientJa4)){
    api.access.deny('suspicious_tls_fingerprint', 'Your TLS fingerprint has been flagged as suspicious');
  }
};

En savoir plus