0
votes

Comment faire l'authentification avec react et node.js express

J'ai créé un joli formulaire de connexion en utilisant react, maintenant je veux le configurer avec mon back-end et j'ai essayé d'écrire une API pour authentifier la connexion des utilisateurs. Je sais que ce n'est pas la bonne manière. Quelqu'un pourrait-il corriger mon côté Node.js, comment dois-je le faire fonctionner? Connexion de réaction:

 exports.checkAuth = (username, password) => {
  return new Promise((resolve, reject) => {
    con.query(
      "SELECT * FROM users WHERE username= $1 AND password = $2",
      [username, password],
      (err, result, fields) => {
        if (err) reject(err);
        if(bcrypt.compareSync(password, result.password)){
          console.log("password matched");
          resolve(result);
        }
      }
    );
  });
};

}

Routeur Node.js:

router.get('/api/login/', async function (req, res, next) {
  console.log(req.query.username);
  console.log(req.query.password);
  // res.sendStatus(200);
  db.checkAuth(req.query.username, req.query.password)
      .then((result) => res.sendStatus(200))
      .catch((error) => res.sendStatus(403)); // Corrected line
});

Fonction de base de données Node.js: p>

 function postLogin() {
axios
  .get(prefix + '/api/login/', {
    params: { username: userName, password: password },
  })
  .then((result) => {
    if (result.status === 200) {
      setAuthTokens(result.data);
      setLoggedIn(true);
    } else {
      setIsError(true);
    }
  })
  .catch((e) => {
    setIsError(true);
  });

DB:

entrez la description de l'image ici

Et quand j'écris mes informations de connexion et essayez de vous connecter à mon monit pm2 entrez la description de l'image ici


0 commentaires

3 Réponses :


1
votes

Vous devez correctement détecter l'erreur de méthode checkAuth et envoyer la réponse correspondante

exports.checkAuth = (username, password) => {
  return new Promise((resolve, reject) => {
    con.query(
      "SELECT * FROM users WHERE username = $1 AND password = $2",
      [username, password],
      (err, result, fields) => {
        if (err) reject(err);
        resolve(result);
      }
    );
  });
};

UPD

De plus, la façon dont vous composez votre requête est vulnérable à Injections SQL . Utilisez la requête paramétrée pour l'éviter.

router.get('/api/login/:username/:password', async function (req, res, next) {
    db.checkAuth(req.params.username, req.params.password)
        .then((result) => res.sendStatus(200))
        .catch((error) => res.sendStatus(403)); // Corrected line
});


3 commentaires

Une chose, mon mot de passe est haché est-ce que cela fonctionnera avec un mot de passe haché?


Vous devez hacher le mot de passe dans la méthode checkAuth, avant de le transmettre à la requête SQL


Bonjour, j'ai mis à jour ma question avec un code corrigé, pouvez-vous regarder?



1
votes

Une chose que vous devez absolument faire est de ne pas hacher votre mot de passe dans le frontend mais plutôt dans le backend. De cette façon, vous n'êtes pas vulnérable à une attaque pass-the-hash.

Configurez également HTTPS et envoyez votre nom d'utilisateur et votre mot de passe dans le corps HTTP (pas en tant que paramètre d'URL). Dans le backend, vous pouvez simplement demander le mot de passe haché du nom d'utilisateur donné et le comparer avec le mot de passe envoyé depuis Frontend. Si vous utilisez bcrypt (en fonction de la capture d'écran que vous avez fournie), cela pourrait ressembler à quelque chose comme:

con.query(`SELECT password FROM users WHERE username='${username}'`, (result) => {
    if(bcrypt.compareSync(password, result.data[0]["password"])){
        // Password correct, return sessionId as response to frontend
    }
})

Vous pouvez alors créer un sessionId que vous renvoyez lorsqu'il s'est connecté avec succès. ( Il y a plusieurs façons de faire l'authentification. Ceci est juste une solution de base simple)

Cet identifiant de session est stocké dans les cookies et envoyé au backend (dans les en-têtes HTTP) avec chaque requête backend.

J'espère que cela pourra vous aider!


0 commentaires

0
votes

Modification de la fonction de requête de base de données comme celle-ci, et cela a résolu le problème.

exports.checkAuth = (username, password) => {
  console.log('username: ' + username + ' and password: ' + password);
  return new Promise((resolve, reject) => {
    con.query(
      "SELECT password FROM users WHERE username= ?",
      [username],
      (err, result, fields) => {
        if (err) reject(err);
        if (bcrypt.compareSync(password, result[0]['password'])) {
          console.log('password matched');
          resolve(result);
        }
      }
    );
  });
};


0 commentaires