auth.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import express from 'express';
  2. import {mongoose} from 'mongoose';
  3. import bcrypt from "bcrypt";
  4. import jwt from "jsonwebtoken";
  5. import {SECRET_KEY} from "../passport.js";
  6. const router = express.Router();
  7. const saltRounds = 10;
  8. const userSchema = new mongoose.Schema({
  9. username: {
  10. type: String,
  11. required: true
  12. },
  13. password: {
  14. type: String,
  15. required: true
  16. }
  17. })
  18. const User = mongoose.model('User', userSchema, 'users');
  19. // TODO split into different routes (/auth)
  20. function generateToken(user) {
  21. const payload = { id: user._id };
  22. return jwt.sign(payload, SECRET_KEY, {expiresIn: '1h'});
  23. }
  24. router.post('/login', function (req, res) {
  25. const username = req.body.username;
  26. const password = req.body.password;
  27. console.log(password);
  28. console.log(password);
  29. if (!password || !username) {
  30. return res.status(400).json({ message: 'parameters invalid' });
  31. }
  32. User.findOne({ username: username })
  33. .then(user => {
  34. if (!user) {
  35. return res.status(422).json({ message: 'no user found' });
  36. }
  37. bcrypt.compare(password, user.password, function (err, result) {
  38. if (result) {
  39. res.json({ token: generateToken(user) });
  40. } else {
  41. res.status(401).json({ error: "Wrong password" });
  42. }
  43. });
  44. })
  45. .catch(err => {
  46. console.log(err);
  47. res.status(500).json({ error: err.message }); // Ensure you send the error message
  48. });
  49. });
  50. router.post('/register', async function (req, res) {
  51. const username = req.body.username;
  52. const password = req.body.password;
  53. if (!password || !username) {
  54. return res.status(400).json({ message: 'parameters invalid' });
  55. }
  56. try {
  57. // Check if user already exists
  58. const existingUser = await User.findOne({ username: username });
  59. if (existingUser) {
  60. return res.status(403).json({ message: 'user already exists' });
  61. }
  62. // Hash the password
  63. bcrypt.hash(password, saltRounds, async function (err, hash) {
  64. if (err) {
  65. return res.status(500).json({ error: err.message });
  66. } else if (hash) {
  67. // Insert user into database and generate token
  68. const user = await User.collection.insertOne({ username: username, password: hash });
  69. return res.json({ token: generateToken(user) });
  70. }
  71. });
  72. } catch (err) {
  73. // Handle errors
  74. console.error(err);
  75. return res.status(500).json({ error: 'Internal Server Error' });
  76. }
  77. });
  78. export { router, User };