webinterface/server/controllers/authController.js

67 lines
2.1 KiB
JavaScript

const User = require('../models/User');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
// Registrierungs-Controller
const register = async (req, res) => {
const { username, email, password } = req.body;
try {
// Überprüfen, ob Benutzername oder E-Mail bereits existieren
let user = await User.findOne({ $or: [{ username }, { email }] });
if (user) {
return res.status(400).json({ message: 'Benutzername oder E-Mail bereits vergeben' });
}
// Überprüfen, ob es sich um den ersten Benutzer handelt
const userCount = await User.countDocuments();
const isAdmin = userCount === 0; // Erster Benutzer wird Admin
// Passwort hashen
const hashedPassword = await bcrypt.hash(password, 10);
// Neuen Benutzer erstellen
user = new User({
username,
email,
password: hashedPassword,
isAdmin,
});
await user.save();
res.status(201).json({ message: 'Registrierung erfolgreich' });
} catch (error) {
res.status(500).json({ message: 'Serverfehler' });
}
};
// Login-Controller
const login = async (req, res) => {
const { email, password } = req.body;
try {
// Benutzer anhand der E-Mail suchen
const user = await User.findOne({ email });
if (!user) {
return res.status(400).json({ message: 'Ungültige Anmeldedaten' });
}
// Passwort überprüfen
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res.status(400).json({ message: 'Ungültige Anmeldedaten' });
}
// JWT-Token erstellen mit benutzerdefinierten Daten
const token = jwt.sign({ id: user._id, username: user.username, docAccess: user.docAccess, isAdmin: user.isAdmin }, process.env.JWT_SECRET, { expiresIn: '1h' });
res.status(200).json({ token, message: 'Login erfolgreich' });
} catch (error) {
res.status(500).json({ message: 'Serverfehler' });
}
};
module.exports = { register, login };