Checkpoint: Migration OAuth Manus vers authentification locale (80% complété) - Pages login/register créées, backend JWT implémenté, guides de déploiement ajoutés. Reste à corriger les doublons dans db.ts et finaliser AdminUsers.
This commit is contained in:
@@ -21,6 +21,83 @@ export const appRouter = router({
|
||||
system: systemRouter,
|
||||
auth: router({
|
||||
me: publicProcedure.query(opts => opts.ctx.user),
|
||||
|
||||
register: publicProcedure
|
||||
.input(z.object({
|
||||
email: z.string().email(),
|
||||
password: z.string().min(6),
|
||||
name: z.string().optional(),
|
||||
}))
|
||||
.mutation(async ({ input, ctx }) => {
|
||||
const { hashPassword, generateToken } = await import("./_core/auth");
|
||||
|
||||
// Vérifier si l'utilisateur existe déjà
|
||||
const existingUser = await db.getUserByEmail(input.email);
|
||||
if (existingUser) {
|
||||
throw new TRPCError({ code: 'CONFLICT', message: 'Un compte existe déjà avec cet email' });
|
||||
}
|
||||
|
||||
// Hasher le mot de passe
|
||||
const hashedPassword = await hashPassword(input.password);
|
||||
|
||||
// Créer l'utilisateur
|
||||
const userId = await db.createUser({
|
||||
email: input.email,
|
||||
password: hashedPassword,
|
||||
name: input.name,
|
||||
emailVerified: false,
|
||||
role: 'user',
|
||||
isActive: true,
|
||||
});
|
||||
|
||||
// Générer un token JWT
|
||||
const token = generateToken(userId);
|
||||
|
||||
// Définir le cookie de session
|
||||
const cookieOptions = getSessionCookieOptions(ctx.req);
|
||||
ctx.res.cookie(COOKIE_NAME, token, cookieOptions);
|
||||
|
||||
return { success: true, userId };
|
||||
}),
|
||||
|
||||
login: publicProcedure
|
||||
.input(z.object({
|
||||
email: z.string().email(),
|
||||
password: z.string(),
|
||||
}))
|
||||
.mutation(async ({ input, ctx }) => {
|
||||
const { verifyPassword, generateToken } = await import("./_core/auth");
|
||||
|
||||
// Récupérer l'utilisateur
|
||||
const user = await db.getUserByEmail(input.email);
|
||||
if (!user) {
|
||||
throw new TRPCError({ code: 'UNAUTHORIZED', message: 'Email ou mot de passe incorrect' });
|
||||
}
|
||||
|
||||
// Vérifier le compte actif
|
||||
if (!user.isActive) {
|
||||
throw new TRPCError({ code: 'FORBIDDEN', message: 'Votre compte a été désactivé' });
|
||||
}
|
||||
|
||||
// Vérifier le mot de passe
|
||||
const isValid = await verifyPassword(input.password, user.password);
|
||||
if (!isValid) {
|
||||
throw new TRPCError({ code: 'UNAUTHORIZED', message: 'Email ou mot de passe incorrect' });
|
||||
}
|
||||
|
||||
// Mettre à jour le dernier login
|
||||
await db.updateUserLastSignedIn(user.id);
|
||||
|
||||
// Générer un token JWT
|
||||
const token = generateToken(user.id);
|
||||
|
||||
// Définir le cookie de session
|
||||
const cookieOptions = getSessionCookieOptions(ctx.req);
|
||||
ctx.res.cookie(COOKIE_NAME, token, cookieOptions);
|
||||
|
||||
return { success: true, user: { id: user.id, email: user.email, name: user.name, role: user.role } };
|
||||
}),
|
||||
|
||||
logout: publicProcedure.mutation(({ ctx }) => {
|
||||
const cookieOptions = getSessionCookieOptions(ctx.req);
|
||||
ctx.res.clearCookie(COOKIE_NAME, { ...cookieOptions, maxAge: -1 });
|
||||
|
||||
Reference in New Issue
Block a user