You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
8.7 KiB
233 lines
8.7 KiB
const UserModel = require('../models/user.model');
|
|
const jwt = require('jsonwebtoken');
|
|
const nodemailer = require('nodemailer');
|
|
const { signUpErrors, signInErrors } = require('../utils/errors.utils');
|
|
const crypto = require('crypto');
|
|
//const nodemailer = require('nodemailer');
|
|
const maxAge = 3 * 24 * 60 * 60 * 1000;
|
|
//expiresIn temps avant l'expiration du token
|
|
const createToken = (id) => {
|
|
return jwt.sign({id}, process.env.TOKEN_SECRET, {
|
|
expiresIn: maxAge
|
|
})
|
|
}
|
|
|
|
|
|
// Définir les informations de connexion pour le service d'envoi d'e-mails
|
|
const transporter = nodemailer.createTransport({
|
|
service: 'gmail',
|
|
auth: {
|
|
user: 'mixmox07340@gmail.com',
|
|
pass: 'Appwow07'
|
|
}
|
|
});
|
|
|
|
// module.exports.signUp = async (req, res) => {
|
|
|
|
// const {pseudo, email, password} = req.body
|
|
|
|
// try {
|
|
// const user = await UserModel.create({pseudo, email, password});
|
|
// // Générer un jeton de vérification
|
|
// const verificationToken = jwt.sign({ email }, 'secret-key', { expiresIn: '24h' });
|
|
// // Préparer l'e-mail de vérification
|
|
// const mailOptions = {
|
|
// from: 'your-email@gmail.com',
|
|
// to: email,
|
|
// subject: 'Vérifiez votre adresse e-mail',
|
|
// html: `
|
|
// <p>Veuillez cliquer sur le lien ci-dessous pour vérifier votre adresse e-mail :</p>
|
|
// <a href="http://your-website.com/verify-email?token=${verificationToken}">Cliquez ici pour vérifier</a>
|
|
// `
|
|
// };
|
|
// // Envoyer l'e-mail de vérification
|
|
// await transporter.sendMail(mailOptions);
|
|
// // Stocker le jeton de vérification associé à l'utilisateur dans la base de données
|
|
// await UserModel.updateOne({ _id: user._id }, { verificationToken });
|
|
// res.status(200).json({ user: user._id});
|
|
// }
|
|
// catch(err) {
|
|
// const errors = signUpErrors(err);
|
|
// res.status(200).send({ errors })
|
|
// }
|
|
// }
|
|
module.exports.sendVerificationEmail = async (req, res) => {
|
|
try {
|
|
const { email } = req.body;
|
|
// Générer un jeton de vérification
|
|
const verificationToken = jwt.sign({ email }, 'secret-key', { expiresIn: '24h' });
|
|
// Préparer l'e-mail de vérification
|
|
const mailOptions = {
|
|
from: 'your-email@gmail.com',
|
|
to: email,
|
|
subject: 'Vérifiez votre adresse e-mail',
|
|
html: `
|
|
<p>Veuillez cliquer sur le lien ci-dessous pour vérifier votre adresse e-mail :</p>
|
|
<a href="http://your-website.com/verify-email?token=${verificationToken}">Cliquez ici pour vérifier</a>
|
|
`
|
|
};
|
|
// Envoyer l'e-mail de vérification
|
|
await transporter.sendMail(mailOptions);
|
|
res.json({ verificationToken });
|
|
} catch (error) {
|
|
console.error(error);
|
|
res.status(500).json({ error });
|
|
}
|
|
};
|
|
|
|
module.exports.forgotPassword = async (req, res) => {
|
|
const { email } = req.body;
|
|
|
|
UserModel.findOne({ email })
|
|
.then(user => {
|
|
if (!user) {
|
|
res.status(404).json({ message: "Aucun utilisateur n'a été trouvé avec cette adresse email" });
|
|
} else {
|
|
// Génération d'un jeton de réinitialisation de mot de passe
|
|
const token = crypto.randomBytes(20).toString('hex');
|
|
user.resetPasswordToken = token;
|
|
user.resetPasswordExpires = Date.now() + 3600000; // 1 heure
|
|
user.save()
|
|
.then(() => {
|
|
// Envoi d'un email avec le lien de réinitialisation de mot de passe
|
|
const transporter = nodemailer.createTransport({
|
|
service: 'gmail',
|
|
auth: {
|
|
user: 'mixmox07340@gmail.com',
|
|
pass: 'fnvepgdxfscstdzl'
|
|
}
|
|
});
|
|
console.log("test5");
|
|
const mailOptions = {
|
|
from: 'mixmox07340@gmail.com',
|
|
to: email,
|
|
subject: 'Réinitialisation de mot de passe',
|
|
text: `Pour réinitialiser votre mot de passe, veuillez cliquer sur ce lien : http://localhost:3000/reset/${token}`
|
|
};
|
|
transporter.sendMail(mailOptions, (error, info) => {
|
|
if (error) {
|
|
console.log(error);
|
|
res.status(500).json({ message: "Une erreur est survenue lors de l'envoi de l'email de réinitialisation de mot de passe" });
|
|
} else {
|
|
console.log('Email sent: ' + info.response);
|
|
res.status(200).json({ message: "Un email de réinitialisation de mot de passe a été envoyé à l'adresse email spécifiée" });
|
|
}
|
|
});
|
|
});
|
|
}
|
|
})
|
|
.catch(err => {
|
|
res.status(500).json({ message: "Une erreur est survenue lors de la recherche de l'utilisateur" });
|
|
});
|
|
};
|
|
|
|
module.exports.resetGet = async (req, res) => {
|
|
UserModel.findOne({ resetPasswordToken: req.params.token, resetPasswordExpires: { $gt: Date.now() } })
|
|
.then(user => {
|
|
if (!user) {
|
|
res.status(404).json({ message: "Le lien de réinitialisation de mot de passe est soit expiré ou invalide" });
|
|
} else {
|
|
// Affichez une page HTML pour saisir un nouveau mot de passe
|
|
res.status(200).send("Veuillez saisir votre nouveau mot de passe");
|
|
}
|
|
})
|
|
.catch(err => {
|
|
res.status(500).json({ message: "Une erreur est survenue lors de la vérification du jeton de réinitialisation de mot de passe" });
|
|
})};
|
|
|
|
module.exports.resetPost = async (req, res) => {
|
|
console.log("test");
|
|
UserModel.findOneAndUpdate({ resetPasswordToken: req.params.token, resetPasswordExpires: { $gt: Date.now() } })
|
|
.then(user => {
|
|
if (!user) {
|
|
res.status(404).json({ message: "Le lien de réinitialisation de mot de passe est soit expiré ou invalide" });
|
|
} else {
|
|
// Modifiez le mot de passe de l'utilisateur et enregistrez-le dans la base de données
|
|
user.password = req.body.password;
|
|
console.log(req.body.password);
|
|
user.resetPasswordToken = undefined;
|
|
user.resetPasswordExpires = undefined;
|
|
// user.save()
|
|
// .then(() => {
|
|
res.status(200).json({ message: "Mot de passe réinitialisé avec succès" });
|
|
// })
|
|
// .catch(err => {
|
|
// res.status(500).json({ message: "Une erreur est survenue lors de la mise à jour du mot de passe" });
|
|
// });
|
|
}
|
|
})
|
|
.catch(err => {
|
|
res.status(500).json({ message: "Une erreur est survenue lors de la vérification du jeton de réinitialisation de mot de passe" });
|
|
});
|
|
};
|
|
|
|
module.exports.verifyEmail = async (req, res) => {
|
|
try {
|
|
const { email, token } = req.body;
|
|
// Vérifier le jeton de vérification
|
|
jwt.verify(token, 'secret-key', async (err, decoded) => {
|
|
if (err) {
|
|
return res.status(401).json({ error: 'Jeton de vérification non valide' });
|
|
}
|
|
if (decoded.email !== email) {
|
|
return res.status(401).json({ error: 'Adresse e-mail non valide' });
|
|
}
|
|
// Marquer l'adresse e-mail comme vérifiée dans la base de données
|
|
const updateResponse = await User.updateOne({ email }, { isVerified: true });
|
|
if (!updateResponse.nModified) {
|
|
return res.status(404).json({ error: 'Adresse e-mail non trouvée' });
|
|
}
|
|
res.json({ isVerified: true });
|
|
});
|
|
} catch (error) {
|
|
console.error(error);
|
|
res.status(500).json({ error: "une erreur s'est produte lors de la vérification de l'adresse e-mail" });
|
|
}
|
|
};
|
|
|
|
//gestion des erreurs
|
|
module.exports.signUp = async (req, res) => {
|
|
console.log(req.body);
|
|
|
|
//Attention à enlever
|
|
|
|
const {pseudo, email, password} = req.body
|
|
|
|
try {
|
|
const user = await UserModel.create({pseudo, email, password});
|
|
res.status(200).json({ user: user._id});
|
|
}
|
|
catch(err) {
|
|
const errors = signUpErrors(err);
|
|
res.status(200).send({ errors })
|
|
}
|
|
}
|
|
|
|
module.exports.signIn = async (req, res) => {
|
|
console.log("signin: ",req.body);
|
|
const {email, password} = req.body
|
|
try {
|
|
|
|
const user = await UserModel.login({email, password});
|
|
|
|
|
|
//creation d'un token
|
|
const token = createToken(user._id);
|
|
|
|
res.cookie('jwt', token, { httpOnly: true, maxAge});
|
|
|
|
res.status(200).json({ user: user._id});
|
|
}
|
|
catch(err) {
|
|
|
|
const errors = signInErrors(err);
|
|
console.log("echec test user ",errors);
|
|
|
|
res.status(200).send({ errors });
|
|
}
|
|
}
|
|
|
|
module.exports.logout = async (req, res) => {
|
|
res.cookie('jwt', '', { maxAge: 1});
|
|
res.redirect('/');
|
|
} |