L'inscription Classeo se fait via invitation : un admin crée un compte, l'utilisateur reçoit un lien d'activation par email pour définir son mot de passe. Ce flow sécurisé évite les inscriptions non autorisées et garantit que seuls les utilisateurs légitimes accèdent au système. Points clés de l'implémentation : - Tokens d'activation à usage unique stockés en cache (Redis/filesystem) - Validation du consentement parental pour les mineurs < 15 ans (RGPD) - L'échec d'activation ne consume pas le token (retry possible) - Users dans un cache séparé sans TTL (pas d'expiration) - Hot reload en dev (FrankenPHP sans mode worker) Story: 1.3 - Inscription et activation de compte
50 lines
1.5 KiB
PHP
50 lines
1.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Administration\Infrastructure\Api\Resource;
|
|
|
|
use ApiPlatform\Metadata\ApiResource;
|
|
use ApiPlatform\Metadata\Post;
|
|
use App\Administration\Infrastructure\Api\Processor\ActivateAccountProcessor;
|
|
use Symfony\Component\Validator\Constraints as Assert;
|
|
|
|
/**
|
|
* API Resource for account activation.
|
|
*
|
|
* This endpoint accepts a token value and new password to activate a user account.
|
|
*/
|
|
#[ApiResource(
|
|
shortName: 'AccountActivation',
|
|
operations: [
|
|
new Post(
|
|
uriTemplate: '/activate',
|
|
processor: ActivateAccountProcessor::class,
|
|
output: ActivateAccountOutput::class,
|
|
validationContext: ['groups' => ['Default', 'activate']],
|
|
name: 'activate_account',
|
|
),
|
|
],
|
|
)]
|
|
final class ActivateAccountInput
|
|
{
|
|
#[Assert\NotBlank(message: 'Le token d\'activation est requis.')]
|
|
#[Assert\Uuid(message: 'Le token d\'activation doit être un UUID valide.')]
|
|
public string $tokenValue = '';
|
|
|
|
#[Assert\NotBlank(message: 'Le mot de passe est requis.')]
|
|
#[Assert\Length(
|
|
min: 8,
|
|
minMessage: 'Le mot de passe doit contenir au moins {{ limit }} caractères.',
|
|
)]
|
|
#[Assert\Regex(
|
|
pattern: '/[A-Z]/',
|
|
message: 'Le mot de passe doit contenir au moins une majuscule.',
|
|
)]
|
|
#[Assert\Regex(
|
|
pattern: '/[0-9]/',
|
|
message: 'Le mot de passe doit contenir au moins un chiffre.',
|
|
)]
|
|
public string $password = '';
|
|
}
|