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:
Et quand j'écris mes informations de connexion et essayez de vous connecter à mon monit pm2
3 Réponses :
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 });
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?
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!
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); } } ); }); };