login
This commit is contained in:
parent
95e6779c8e
commit
2c656aadf0
5 changed files with 235 additions and 32 deletions
|
@ -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);
|
||||
|
|
|
@ -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' });
|
||||
}
|
||||
});
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue