auth.js 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. const bcrypt = require('bcrypt');
  2. const { User } = require('../models/user.model');
  3. const jwt = require('jsonwebtoken');
  4. const config = require('../config/config.json');
  5. const nodemailer = require('nodemailer');
  6. var validator = require('validator');
  7. const role = require('../lib/role');
  8. //inscription user
  9. exports.signup = async (req, res, next) => {
  10. try {
  11. // génère une exception
  12. if (!req.body.firstname) { throw new Error('Nom introuvable') }
  13. if (!req.body.lastname) { throw new Error('Prénom introuvable') }
  14. if (!req.body.email) { throw new Error('Adresse email introuvable') }
  15. if (!req.body.birthday) { throw new Error('Date de naissance introuvable') }
  16. if (!req.body.phonenumber) { throw new Error('Numéro de téléphone introuvable') }
  17. if (!req.body.adress) { throw new Error('Adresse introuvable') }
  18. if (!validator.isEmail(req.body.email)) { throw new Error('Adresse email invalide') }
  19. if (isNaN(Date.parse(req.body.birthday)) || (Date.parse(req.body.birthday)) > 1073692800000) { throw new Error('Date de naissance invalide') }
  20. const user = await User.findOne({ email: req.body.email }, { email: 1 })
  21. if (user) {
  22. res.status(401).json({ success: false, message: 'Adresse email existe déja veuillez renseigner une autre adresse email' })
  23. } else {
  24. bcrypt.hash(req.body.password, 12)
  25. .then(hash => {
  26. const user = new User({
  27. firstname: req.body.firstname,
  28. lastname: req.body.lastname,
  29. email: req.body.email,
  30. role: role.Client,
  31. birthday: req.body.birthday,
  32. phonenumber: req.body.phonenumber,
  33. adress: req.body.adress,
  34. isActive: true,
  35. isGain: false,
  36. password: hash
  37. });
  38. user.save()
  39. .then(() => {
  40. console.log('utilisateur =>', user)
  41. const token = jwt.sign({ userId: user._id, email: user.email, role: user.role }, config.secret_key, { expiresIn: '10 h' })
  42. res.status(201).json(
  43. { success: true, token, expireIn: `${new Date().getTime() + 120000}` })
  44. })
  45. .catch((err) => res.status(500).json({ success: false, message: err.message }))
  46. })
  47. .catch(() => res.status(400).json({ success: false, message: 'Erreur dans le mot de passe' }));
  48. }
  49. }
  50. catch (err) {
  51. res.status(400).json({ success: false, message: err.message })
  52. }
  53. };
  54. //login User
  55. exports.login = (req, res, next) => {
  56. try {
  57. // génère une exception
  58. if (!req.body.email) { throw new Error('Adresse email introuvable') }
  59. if (!req.body.password) { throw new Error('Mot de passe introuvable') }
  60. if (!validator.isEmail(req.body.email)) { throw new Error('Adresse email invalide') }
  61. User.findOne({ email: req.body.email })
  62. .then(user => {
  63. if (!user) {
  64. return res.status(404).json({ success: false, message: 'Utilisateur non trouvé' });
  65. }
  66. bcrypt.compare(req.body.password, user.password)
  67. .then(valid => {
  68. if (!valid) { return res.status(401).json({ success: false, message: 'Mot de passe incorrect' }) }
  69. if(user.role == 'client') {
  70. const token = jwt.sign({ userId: user._id, email: user.email, role: user.role }, config.secret_key, { expiresIn: '10 h' })
  71. res.status(200).json(
  72. { success: true, token, expireIn: `${new Date().getTime() + 120000}` })
  73. } else {
  74. res.status(403).json({
  75. success: false,
  76. message: 'Permission failed'
  77. })
  78. }
  79. })
  80. .catch(error => res.status(500).json({ error }))
  81. })
  82. .catch(error => res.status(500).json({ error }));
  83. }
  84. catch (err) { res.status(400).json({ success: false, message: err.message }) }
  85. };
  86. //login User
  87. exports.loginAdmin = (req, res, next) => {
  88. try {
  89. // génère une exception
  90. if (!req.body.email) { throw new Error('Adresse email introuvable') }
  91. if (!req.body.password) { throw new Error('Mot de passe introuvable') }
  92. if (!validator.isEmail(req.body.email)) { throw new Error('Adresse email invalide') }
  93. User.findOne({ email: req.body.email })
  94. .then(user => {
  95. if (!user) {
  96. return res.status(404).json({ success: false, message: 'Utilisateur non trouvé' });
  97. }
  98. bcrypt.compare(req.body.password, user.password)
  99. .then(valid => {
  100. if (!valid) { return res.status(401).json({ success: false, message: 'Mot de passe incorrect' }) }
  101. if(user.role == 'admin' || user.role == 'employee') {
  102. const token = jwt.sign({ userId: user._id, email: user.email, role: user.role }, config.secret_key, { expiresIn: '10 h' })
  103. res.status(200).json(
  104. { success: true, token, expireIn: `${new Date().getTime() + 120000}` })
  105. } else {
  106. res.status(403).json({
  107. success: false,
  108. message: 'Permission failed'
  109. })
  110. }
  111. })
  112. .catch(error => res.status(500).json({ error }))
  113. })
  114. .catch(error => res.status(500).json({ error }));
  115. }
  116. catch (err) { res.status(400).json({ success: false, message: err.message }) }
  117. };
  118. //forgot password
  119. exports.forgotPassword = async (req, res, next) => {
  120. try {
  121. //console.log(JSON.stringify(req.body));
  122. // génère une exception
  123. if (!req.body.email) { throw new Error('Adresse email introuvable') }
  124. if (!validator.isEmail(req.body.email)) { throw new Error('Adresse email invalide') }
  125. var smtpTransport = nodemailer.createTransport({
  126. host: config.email.host,
  127. port: config.email.port,
  128. secure: true,
  129. auth: { user: config.email.user, pass: config.email.pass },
  130. tls: { rejectUnauthorized: false }
  131. });
  132. console.log("JSON.stringify(smtpTransport)");
  133. User.findOne({ email: req.body.email })
  134. .then((user) => {
  135. if (!user) {
  136. console.log("user found");
  137. return res.status(404).json({ success: false, message: 'Utilisateur non trouvé avec cette adresse email' });
  138. }
  139. const token = jwt.sign({ userId: user._id, email: user.email, role: user.role }, config.reset_password_key, { expiresIn: '20m' })
  140. var mailOptions = {
  141. to: req.body.email,
  142. from: config.email.user,
  143. subject: 'Réinitialisation de votre mot de passe',
  144. html: `<h3>Cliquez sur ce lien pour rénisialiser votre mot de passe</h3>
  145. <p>${config.reset_password_url}/${token}</p> `
  146. };
  147. user.updateOne({ resetLink: token })
  148. .then(() => {
  149. console.log("debut d envoi");
  150. smtpTransport.sendMail(mailOptions)
  151. .then(() => res.status(200).json({ success: true, message: `Un e-mail vous a été envoyé pour réinitialiser votre mot de passe` }))
  152. .catch((e) => res.status(500).json({ success: false, message: `${e}` }))
  153. })
  154. .catch((e) => res.status(400).json({ success: false, message: `Réinitialisation de votre mot de passe a échoué` }))
  155. })
  156. .catch(() => res.status(500).json({ success: false, message: 'Erreur dans le serveur' }));
  157. }
  158. catch (err) { res.status(400).json({ success: false, message: err.message }) }
  159. };
  160. //reset password
  161. exports.resetPassword = async (req, res, next) => {
  162. try {
  163. // génère une exception
  164. if (!req.body.password) { throw new Error('Nouveau mot de passe introuvable') }
  165. if (!req.body.resetLink) { throw new Error('Token introuvable') }
  166. jwt.verify(req.body.resetLink, config.reset_password_key, (error, decodedToken) => {
  167. if (error) { return res.status(401).json({ success: false, message: error.message }) }
  168. User.findOne({ resetLink: req.body.resetLink })
  169. .then((user) => {
  170. if (!user) {
  171. return res.status(404).json({ success: false, message: 'Utilisateur non trouvé avec ce token' });
  172. }
  173. bcrypt.hash(req.body.password, 12)
  174. .then(hash => {
  175. user.updateOne({ resetLink: '', password: hash })
  176. .then(() => { res.status(200).json({ success: false, message: 'Votre mot de passe a été changé avec success' }) })
  177. .catch((err) => res.status(500).json({ success: false, message: err.message }))
  178. })
  179. .catch(() => res.status(400).json({ success: false, message: 'Erreur dans le mot de passe' }));
  180. })
  181. .catch((e) => res.status(500).json({ success: false, message: `Erreur dans le serveur` }))
  182. });
  183. }
  184. catch (err) { res.status(400).json({ success: false, message: err.message }) }
  185. };