This commit is contained in:
el 2025-04-02 00:40:31 +02:00
parent 95e6779c8e
commit 2c656aadf0
5 changed files with 235 additions and 32 deletions

View file

@ -5,6 +5,7 @@ import { PrismaClient } from '@prisma/client';
import userRoutes from './routes/userRoutes';
import pageRoutes from './routes/pageRoutes';
import blockRoutes from './routes/blockRoutes';
import cookieParser from 'cookie-parser';
// Chargement des variables d'environnement
dotenv.config();
@ -17,12 +18,14 @@ const port = process.env.PORT || 3001;
app.use(cors({
origin: 'http://localhost:3000',
credentials: true,
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization']
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH'],
allowedHeaders: ['Content-Type', 'Authorization', 'Cookie'],
exposedHeaders: ['Set-Cookie'],
}));
// Middleware
app.use(express.json());
app.use(cookieParser());
// Routes
app.use('/api/users', userRoutes);

View file

@ -1,9 +1,11 @@
import express from 'express';
import { PrismaClient } from '@prisma/client';
import bcrypt from 'bcryptjs';
import jwt from 'jsonwebtoken';
const router = express.Router();
const prisma = new PrismaClient();
const JWT_SECRET = process.env.JWT_SECRET || 'votre-secret-jwt';
// Supprimer un utilisateur (route de développement)
router.delete('/:email', async (req, res) => {
@ -23,28 +25,44 @@ router.delete('/:email', async (req, res) => {
router.post('/register', async (req, res) => {
try {
const { email, password, name } = req.body;
// Vérification si l'utilisateur existe déjà
console.log('Tentative d\'inscription:', { email, name });
// Vérification des champs requis
if (!email || !password) {
return res.status(400).json({ message: 'Email et mot de passe requis' });
}
const existingUser = await prisma.user.findUnique({
where: { email }
});
if (existingUser) {
console.log('Email déjà utilisé:', email);
return res.status(400).json({ message: 'Cet email est déjà utilisé' });
}
// Hashage du mot de passe
const hashedPassword = await bcrypt.hash(password, 10);
console.log('Création de l\'utilisateur...');
// Création de l'utilisateur
const user = await prisma.user.create({
data: {
email,
password: hashedPassword,
name
name: name || email.split('@')[0]
}
});
console.log('Utilisateur créé avec succès:', user.id);
const token = jwt.sign({ userId: user.id }, JWT_SECRET, { expiresIn: '24h' });
res.cookie('token', token, {
httpOnly: true,
secure: false,
sameSite: 'lax',
path: '/',
maxAge: 24 * 60 * 60 * 1000
});
res.status(201).json({
id: user.id,
email: user.email,
@ -52,7 +70,10 @@ router.post('/register', async (req, res) => {
});
} catch (error) {
console.error('Erreur lors de l\'inscription:', error);
res.status(500).json({ message: 'Erreur lors de l\'inscription' });
res.status(500).json({
message: 'Erreur lors de l\'inscription',
details: error instanceof Error ? error.message : 'Erreur inconnue'
});
}
});
@ -62,7 +83,6 @@ router.post('/login', async (req, res) => {
const { email, password } = req.body;
console.log('Tentative de connexion pour:', email);
// Recherche de l'utilisateur
const user = await prisma.user.findUnique({
where: { email }
});
@ -73,8 +93,6 @@ router.post('/login', async (req, res) => {
}
console.log('Utilisateur trouvé, vérification du mot de passe');
// Vérification du mot de passe
const validPassword = await bcrypt.compare(password, user.password);
console.log('Mot de passe valide:', validPassword);
@ -82,6 +100,15 @@ router.post('/login', async (req, res) => {
return res.status(400).json({ message: 'Email ou mot de passe incorrect' });
}
const token = jwt.sign({ userId: user.id }, JWT_SECRET, { expiresIn: '24h' });
res.cookie('token', token, {
httpOnly: true,
secure: false,
sameSite: 'lax',
path: '/',
maxAge: 24 * 60 * 60 * 1000 // 24 heures
});
res.json({
id: user.id,
email: user.email,
@ -93,17 +120,29 @@ router.post('/login', async (req, res) => {
}
});
// Déconnexion
router.post('/logout', (req, res) => {
res.clearCookie('token', {
httpOnly: true,
secure: false,
sameSite: 'lax',
path: '/'
});
res.json({ message: 'Déconnexion réussie' });
});
// Vérifier l'état de l'authentification
router.get('/me', async (req, res) => {
try {
const { email } = req.query;
if (!email) {
return res.status(400).json({ message: 'Email requis' });
const token = req.cookies.token;
if (!token) {
return res.status(401).json({ message: 'Non authentifié' });
}
const decoded = jwt.verify(token, JWT_SECRET) as { userId: string };
const user = await prisma.user.findUnique({
where: { email: email as string }
where: { id: decoded.userId }
});
if (!user) {
@ -117,7 +156,7 @@ router.get('/me', async (req, res) => {
});
} catch (error) {
console.error('Erreur lors de la vérification de l\'authentification:', error);
res.status(500).json({ message: 'Erreur lors de la vérification de l\'authentification' });
res.status(401).json({ message: 'Session invalide' });
}
});