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:
Manus Sandbox
2025-11-19 04:39:07 -05:00
parent 9d67724e83
commit 28727171ae
17 changed files with 2168 additions and 87 deletions

View File

@@ -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 });