diff --git a/backend/src/auth/auth.service.spec.ts b/backend/src/auth/auth.service.spec.ts index 6564cb8..4a18178 100644 --- a/backend/src/auth/auth.service.spec.ts +++ b/backend/src/auth/auth.service.spec.ts @@ -148,7 +148,7 @@ describe("AuthService", () => { const dto = { username: "test", email: "test@example.com", - password: "password", + password: "Password1!", }; mockHashingService.hashPassword.mockResolvedValue("hashed-password"); mockHashingService.hashEmail.mockResolvedValue("hashed-email"); @@ -165,7 +165,7 @@ describe("AuthService", () => { describe("login", () => { it("should login a user", async () => { - const dto = { email: "test@example.com", password: "password" }; + const dto = { email: "test@example.com", password: "Password1!" }; const user = { uuid: "user-id", username: "test", diff --git a/backend/src/auth/dto/register.dto.ts b/backend/src/auth/dto/register.dto.ts index 2dbc5ec..435435c 100644 --- a/backend/src/auth/dto/register.dto.ts +++ b/backend/src/auth/dto/register.dto.ts @@ -2,6 +2,7 @@ import { IsEmail, IsNotEmpty, IsString, + Matches, MaxLength, MinLength, } from "class-validator"; @@ -10,6 +11,9 @@ export class RegisterDto { @IsString() @IsNotEmpty() @MaxLength(32) + @Matches(/^[a-z0-9_]+$/, { + message: "username must contain only lowercase letters, numbers, and underscores", + }) username!: string; @IsString() @@ -21,5 +25,15 @@ export class RegisterDto { @IsString() @MinLength(8) + @Matches(/[A-Z]/, { + message: "password must contain at least one uppercase letter", + }) + @Matches(/[a-z]/, { + message: "password must contain at least one lowercase letter", + }) + @Matches(/[0-9]/, { message: "password must contain at least one number" }) + @Matches(/[^A-Za-z0-9]/, { + message: "password must contain at least one special character", + }) password!: string; } diff --git a/frontend/src/app/(auth)/login/page.tsx b/frontend/src/app/(auth)/login/page.tsx index 42d5ca0..6316d94 100644 --- a/frontend/src/app/(auth)/login/page.tsx +++ b/frontend/src/app/(auth)/login/page.tsx @@ -30,7 +30,7 @@ const loginSchema = z.object({ email: z.string().email({ message: "Email invalide" }), password: z .string() - .min(6, { message: "Le mot de passe doit faire au moins 6 caractères" }), + .min(8, { message: "Le mot de passe doit faire au moins 8 caractères" }), }); type LoginFormValues = z.infer; diff --git a/frontend/src/app/(auth)/register/page.tsx b/frontend/src/app/(auth)/register/page.tsx index 1a52bb1..a2756bf 100644 --- a/frontend/src/app/(auth)/register/page.tsx +++ b/frontend/src/app/(auth)/register/page.tsx @@ -29,11 +29,24 @@ import { useAuth } from "@/providers/auth-provider"; const registerSchema = z.object({ username: z .string() - .min(3, { message: "Le pseudo doit faire au moins 3 caractères" }), + .min(3, { message: "Le pseudo doit faire au moins 3 caractères" }) + .regex(/^[a-z0-9_]+$/, { + message: "Le pseudo ne doit contenir que des minuscules, chiffres et underscores", + }), email: z.string().email({ message: "Email invalide" }), password: z .string() - .min(6, { message: "Le mot de passe doit faire au moins 6 caractères" }), + .min(8, { message: "Le mot de passe doit faire au moins 8 caractères" }) + .regex(/[A-Z]/, { + message: "Le mot de passe doit contenir au moins une majuscule", + }) + .regex(/[a-z]/, { + message: "Le mot de passe doit contenir au moins une minuscule", + }) + .regex(/[0-9]/, { message: "Le mot de passe doit contenir au moins un chiffre" }) + .regex(/[^A-Za-z0-9]/, { + message: "Le mot de passe doit contenir au moins un caractère spécial", + }), displayName: z.string().optional(), }); @@ -84,12 +97,25 @@ export default function RegisterPage() {
+ ( + + Nom d'affichage (Optionnel) + + + + + + )} + /> ( - Pseudo + Pseudo (minuscule) @@ -110,19 +136,6 @@ export default function RegisterPage() { )} /> - ( - - Nom d'affichage (Optionnel) - - - - - - )} - />