Impossible de réinitialiser un mot de passe d'utilisateur

Hello tout le monde !
Je suis en train d’implémenter un système de connexion, avec Directus.
Tout fonctionne très bien, connexion, refreshToken et déconnexion (et gestion du type d’utilisateur), mais par contre impossible d’envoyer un lien de réinitialisation de mot de passe.
Y a t’il des manipulations à effectuer sur le serveur pour que Directus puisse envoyer un mail ? (j’ai pris un serveur sur hetzner et suivi pas à pas ton cours sur Directus pour le configurer).
La réinitialisation ne fonctionne pas sur le panel d’administration de Directus.
En espérant que quelqu’un pourra m’aider :).

@Lugdu
Je vois que la doc de Directus indique qu’il est nécessaire de configurer les variable d’environnement pour que cette fonctionnalité soit active :

Note: You need to configure the PASSWORD_RESET_URL_ALLOW_LIST environment variable to enable this feature.

Je ne l’ai pas encore fait mais normalement il y a les explication ici :

directus@monserveurhetzner:~/my_app_project$ ll
total 488
drwxrwxr-x   5 directus directus   4096 Nov 10 11:26 ./
drwxr-xr-x  10 directus directus   4096 Nov  3 16:40 ../
-rw-r-----   1 directus directus  10452 Oct 23 10:27 .env
drwxrwxr-x  10 directus directus   4096 Oct 23 10:25 extensions/
drwxrwxr-x 689 directus directus  32768 Nov 10 11:05 node_modules/
-rw-rw-r--   1 directus directus    333 Nov 10 11:04 package.json
-rw-rw-r--   1 directus directus 426842 Nov 10 11:05 package-lock.json
drwxrwxr-x   2 directus directus   4096 Nov  3 16:40 uploads/

Je pense qu’il faut modifier le
-rw-r----- 1 directus directus 10452 Oct 23 10:27 .env

Si quelqu’un (par exemple @mbritto :joy: :joy:)sait comment faire par contre ca serait cool :pray: :pray:

Merci @Xababa_Dalabama pour ta réponse, mais leur documentation n’est pas très clair, concernant les variables d’environnement (en tout cas pas très clair pour moi, pourtant j’ai plutôt l’habitude de lire des documentations).

@Lugdu
Je tente l’opération sans savoir trop où je vais mais je partage si ca peut t’aider :

  1. J’ai ouvert le terminal et j’ai accéder à mon serveur :
ssh directus@<monip>

Ensuite je suis aller dans le dossier de mon serveur directus :

cd /home/directus/mon_projet_app

Ensuite j’ai ouvert le fichier .env avec nano

nano .env

Et là ca m’a ouvert le fichier .env :

Je pense qu’il doit falloir rajouter quelque part par là le

PASSWORD_RESET_URL_ALLOW_LIST

image

Par contre ce que je ne sais pas c’est s’il faut avoir créer une page web dédiée de son côté avec toutes les options ou si directus fourni quelque chose… Si quelqu’un sait, ca serait cool de compléter :stuck_out_tongue:

Deux articles sur le sujet qui me font penser que ce n’est pas si simple que ca :

J’ai mis en place la réinitialisation de mot de passe avec Directus, j’ai choisis l’API Mailgun plutôt que de configurer mon serveur unix et sendmail.
La tâche reste complexe mais elle est faisable :

  1. Configurer un compte Mailgun
  2. Configurer les paramètres directus EMAIL_TRANSPORT, EMAIL_MAILGUN_DOMAIN et EMAIL_MAILGUN_API_KEY pour envoyer les emails avec ce fournisseur

Ensuite il faut respecter le reste de la procédure pour la réinitialisation des mots de passe :

  1. Configurer une URL où envoyer l’utilisateur pour choisir un nouveau mot de passe (PASSWORD_RESET_URL_ALLOW_LIST dans .env)
  2. Lancer la procédure via cette API : Start reset password request
  3. Finaliser la procédure depuis la page web en envoyant le nouveau mot de passe : Reset password

Pour les 2 dernières étapes j’utilise ma lib directus en Dart qui contient les 2 fonctions toutes prêtes, mais le reste doit être fait dans chaque projet.

2 « J'aime »

Hello!

Est-ce qu’il y a eu des changements depuis ce post ? :sweat_smile:

Voici mon fichier .env :

Au niveau du code en Dart, le retour de la fonction apiManager.requestPasswordReset(...) renvoie un future mais on a aussi besoin d’un token. À quel moment peut-on récupérer ce token le renvoyer au script suivant ?

Et voici le contenu de mon script php pour la réinitialisation du mot de passe :

<?php
$message = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Read the data from the form
    $password = $_POST['password'];
    $confirm_password = $_POST['confirm_password'];
    $token = $_GET['token']; // Assuming the token is in the URL as a query parameter
 

    // Check if passwords match
    if ($password !== $confirm_password) {
        $message = 'Les mots de passe ne sont pas identiques.';
    } else {
        // Send the password reset request to the server (modify this part as per your server's requirements)
        $url = 'https://back-office.ekronoz.com/auth/password/reset';
        $data = [
            'token' => $token,
            'password' => $password
        ];

        $options = [
            'https' => [
                'method'  => 'POST',
                'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
                'content' => http_build_query($data)
            ]
        ];
        $context  = stream_context_create($options);
        $result = file_get_contents($url, false, $context);

        if ($result === FALSE) {
            $message = 'Error resetting password.';
        } else {
            $message = 'Password reset successful!';
        }
    }
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Réinitialisation du mot de passe</title>
</head>
<body>
    <?php if ($message): ?>
        <p><?php echo $message; ?></p><p><?php echo $token; ?></p>
    <?php endif; ?>

    <form action="" method="POST">
        <div>
            <label for="password">Nouveau mot de passe :</label>
            <input type="password" name="password" required>
        </div>
        <div>
            <label for="confirm_password">Confirmation du mot de passe :</label>
            <input type="password" name="confirm_password" required>
        </div>
        <button type="submit">Réinitialiser mon mot de passe</button>
    </form>
</body>
</html>

J’ai configuré le provider SendGrid pour l’envoi des mails.

Je suis un peu perdu dans le déroulement des étapes à suivre. Quelqu’un aurait déjà été confronté à ce problème?

Salut,

Lorsque tu fais ta demande de réinitialisation Directus va générer un lien de réinitialisation avec un token en paramètre.

expl : https://mon-instance.tld/reset**?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx**

A priori tu le récupère bien dans ton script, donc si l’envoie de mail fonctionne il ne devrait pas y avoir de problème.

D’après la doc, pour réinitialiser ton mot de passe du doit envoyer un password_reset_token et le nouveau mot de passe.

image

Cela est bien présent dans ton script.

$data = [
    'token' => $token,
    'password' => $password
];

Si tout se passe bien jusque la, il reste une dernière chose à mettre en place, c’est la configuration du CORS (sur les instance auto-hébergées, pour les autre je ne sais pas)

Il faudrait rajouter dans ton env :

CORS_ENABLED: "true"
CORS_ORIGIN: "back-office.ekronoz.com" # ou true pour tout autoriser
2 « J'aime »

Merci pour ta réponse c’est très gentil ! :smiley: