10 KiB
🔐 Sécurisation Signature Salarié - Vérification Date de Naissance
📋 Vue d'ensemble
Un système de vérification par date de naissance a été ajouté à la page /signature-salarie/ pour sécuriser l'accès aux documents de signature électronique.
Fonctionnement
Lorsqu'un salarié clique sur le lien de signature reçu par email :
- 🔒 Un modal de sécurité moderne s'affiche automatiquement
- 📅 Le salarié doit saisir sa date de naissance
- ✅ Le système vérifie dans la base de données (table
salaries) - 📝 Si la date correspond, le formulaire DocuSeal s'affiche
- ❌ Sinon, un message d'erreur apparaît et le formulaire reste bloqué
🎨 Interface utilisateur
Modal de vérification
- Design moderne avec gradient bleu et animations fluides
- Header avec icône Shield et titre explicite
- Input date avec validation HTML5
- Messages d'erreur clairs et animés
- Footer informatif sur la protection des données
- Bouton désactivé jusqu'à saisie d'une date valide
- Loader animé pendant la vérification
Expérience utilisateur
- 🎯 Simple : Un seul champ à remplir
- 🚀 Rapide : Vérification en moins d'une seconde
- 💬 Pédagogique : Messages d'aide après 2 tentatives échouées
- 🎭 Animations : Entrées/sorties fluides pour une UX moderne
- 📱 Responsive : Adapté mobile et desktop
🛠️ Architecture technique
Fichiers créés
1. API de vérification
app/api/signature-salarie/verify-birthdate/route.ts
Fonctionnalités :
- ✅ Authentification via
docuseal_id - ✅ Recherche du contrat dans
cddu_contracts - ✅ Récupération du salarié via
employee_id - ✅ Vérification de la
date_naissancedans tablesalaries - ✅ Comparaison des dates (format normalisé YYYY-MM-DD)
- ✅ Gestion des cas edge (date manquante = acceptation)
- ✅ Logs détaillés pour debug
Endpoint :
POST /api/signature-salarie/verify-birthdate
Body :
{
"docuseal_id": "abc123xyz",
"birthdate": "1990-05-15"
}
Réponses :
// Succès
{
"verified": true,
"message": "Date de naissance vérifiée"
}
// Échec
{
"verified": false,
"error": "Date de naissance incorrecte"
}
2. Composant Modal
app/signature-salarie/BirthdateVerificationModal.tsx
Props :
interface BirthdateVerificationModalProps {
docuseal_id: string;
onVerified: () => void;
}
Features :
- ✅ Input type="date" avec validation HTML5
- ✅ Limite date max = aujourd'hui
- ✅ Gestion des états (loading, error, success)
- ✅ Compteur de tentatives
- ✅ Message d'aide après 2 échecs
- ✅ Animations Tailwind (animate-in, fade-in, etc.)
- ✅ Design avec gradient et icônes Lucide
3. Intégration dans la page
app/signature-salarie/SignatureSalarieContent.tsx
Modifications :
- ✅ Import du composant
BirthdateVerificationModal - ✅ Ajout de l'état
isVerified(défaut:false) - ✅ Affichage conditionnel du modal (
!isVerified) - ✅ Callback
onVerifiedpour fermer le modal - ✅ Le formulaire DocuSeal ne se charge que si vérifié
🔍 Flux de données
1. Utilisateur arrive sur /signature-salarie/?docuseal_id=xxx
↓
2. Page charge avec modal affiché (isVerified = false)
↓
3. Utilisateur saisit sa date de naissance
↓
4. Click sur "Vérifier et accéder au document"
↓
5. Appel API : POST /api/signature-salarie/verify-birthdate
↓
6. API cherche le contrat via docuseal_id
↓
7. API récupère le salarié via employee_id
↓
8. API compare date saisie vs date_naissance en base
↓
9a. Si match → { verified: true }
↓
Modal se ferme (isVerified = true)
↓
Formulaire DocuSeal s'affiche
9b. Si pas de match → { verified: false, error: "..." }
↓
Message d'erreur affiché
↓
Input réinitialisé
↓
Tentatives incrémentées
🎯 Cas d'usage
Scénario 1 : Date correcte
1. Salarié reçoit email avec lien
2. Clique sur le lien
3. Modal s'affiche
4. Saisit sa vraie date de naissance : "15/05/1990"
5. Clique sur "Vérifier"
6. ✅ Modal se ferme
7. ✅ Formulaire DocuSeal apparaît
8. ✅ Peut signer son contrat
Scénario 2 : Date incorrecte (1ère tentative)
1. Salarié saisit une mauvaise date : "01/01/2000"
2. Clique sur "Vérifier"
3. ❌ Erreur : "Date de naissance incorrecte"
4. Input se vide
5. Peut réessayer
Scénario 3 : Date incorrecte (3e tentative)
1. Salarié échoue 2 fois
2. Échoue une 3e fois
3. ❌ Message : "Date de naissance incorrecte"
4. ℹ️ Message additionnel : "Besoin d'aide ? Contactez-nous à paie@odentas.fr"
Scénario 4 : Date manquante en base
1. API détecte que date_naissance = null dans salaries
2. ⚠️ Log : "Date de naissance non renseignée"
3. ✅ Accepte quand même (pour ne pas bloquer)
4. ✅ Modal se ferme
5. ℹ️ À corriger dans la base pour la prochaine fois
🔐 Sécurité
Protection mise en place
| Aspect | Détail |
|---|---|
| Authentification | Via docuseal_id (slug unique et secret) |
| Vérification | Comparaison stricte des dates |
| Données sensibles | Date de naissance jamais exposée au client |
| Service Role | Accès base de données avec droits admin |
| Logs | Toutes les tentatives sont loggées |
| Limite | Pas de limite de tentatives (volontaire) |
Points d'attention
⚠️ Données manquantes : Si un salarié n'a pas de date_naissance en base, il peut quand même accéder (pour éviter de bloquer des signatures légitimes).
💡 Recommandation : S'assurer que tous les salariés ont une date de naissance renseignée dans la table salaries.
📊 Base de données
Tables utilisées
cddu_contracts
SELECT
employee_id,
salarie_email,
docuseal_employee_slug
FROM cddu_contracts
WHERE docuseal_employee_slug = 'abc123';
salaries
SELECT
id,
prenom,
nom,
date_naissance
FROM salaries
WHERE id = '<employee_id>';
Champ requis
| Table | Colonne | Type | Requis | Remarques |
|---|---|---|---|---|
cddu_contracts |
docuseal_employee_slug |
text |
✅ | Slug DocuSeal unique |
cddu_contracts |
employee_id |
uuid |
✅ | FK vers salaries |
salaries |
date_naissance |
date |
⚠️ | Si null, accepte quand même |
🧪 Tests
Test manuel
-
Créer un contrat test
- Avec un salarié ayant une date de naissance connue
-
Générer une signature DocuSeal
- Récupérer le
docuseal_employee_slug
- Récupérer le
-
Accéder à l'URL
https://paie.odentas.fr/signature-salarie/?docuseal_id=<slug> -
Tester différents scénarios
- ✅ Date correcte
- ❌ Date incorrecte
- 📅 Date future (bloquée par HTML5)
- 🔄 Plusieurs tentatives
Test API (cURL)
curl -X POST https://paie.odentas.fr/api/signature-salarie/verify-birthdate \
-H "Content-Type: application/json" \
-d '{
"docuseal_id": "abc123xyz",
"birthdate": "1990-05-15"
}'
Réponse attendue :
{
"verified": true,
"message": "Date de naissance vérifiée"
}
📝 Logs
Console API
=== API Vérification Date de Naissance Salarié ===
🔍 Vérification pour docuseal_id: abc123xyz
📄 Contrat trouvé: { employee_id: '...', salarie_email: '...' }
👤 Salarié trouvé: { prenom: 'Jean', nom: 'Dupont', date_naissance: '1990-05-15' }
📅 Comparaison dates: { db: '1990-05-15', input: '1990-05-15', match: true }
✅ Date de naissance vérifiée avec succès
Console Frontend
// En cas d'erreur
console.error('Erreur lors de la vérification:', err);
// L'état du composant change
isVerifying: false → true → false
error: null → "Date de naissance incorrecte"
attempts: 0 → 1 → 2 → 3...
🚀 Déploiement
Prérequis
- ✅ Colonne
docuseal_employee_slugexiste danscddu_contracts - ✅ Colonne
date_naissanceexiste danssalaries - ✅ Relation FK
employee_idconfigurée
Checklist
- API créée :
/api/signature-salarie/verify-birthdate/route.ts - Composant modal créé :
BirthdateVerificationModal.tsx - Intégration dans :
SignatureSalarieContent.tsx - Tests manuels effectués
- Vérifier que les salariés ont des dates de naissance
- Déployer sur Vercel
- Tester en production avec un vrai contrat
Déploiement
# Les fichiers sont déjà prêts
# Il suffit de commit et push
git add .
git commit -m "feat: Ajout vérification date de naissance signature salarié"
git push origin main
# Vercel déploie automatiquement
🎨 Design
Couleurs utilisées
- Primary :
from-blue-600 to-blue-700(gradient) - Hover :
from-blue-700 to-blue-800 - Background info :
bg-blue-50/border-blue-200 - Error :
bg-red-50/text-red-900 - Text :
text-gray-700/text-gray-900
Icônes (Lucide)
- 🛡️
Shield: Sécurité - 📅
Calendar: Date - ⚠️
AlertCircle: Erreur - ⏳
Loader2: Chargement (animate-spin)
Animations
animate-in fade-in duration-200: Apparition modalanimate-in zoom-in-95 duration-300: Entrée carteanimate-in slide-in-from-top-2 duration-200: Message erreuranimate-spin: Loader
🔧 Maintenance
Problèmes possibles
| Problème | Cause | Solution |
|---|---|---|
| Date toujours refusée | Format date incorrect | Vérifier format en base (YYYY-MM-DD) |
| Salarié introuvable | employee_id incorrect |
Vérifier la relation FK |
| Slug invalide | docuseal_employee_slug null |
Vérifier l'intégration DocuSeal |
| Modal ne se ferme pas | Callback non appelé | Vérifier onVerified() |
Amélioration future
- Ajouter un captcha après X tentatives
- Envoyer un email après 5 échecs
- Logger les tentatives dans une table dédiée
- Ajouter une vérification supplémentaire (email ou code SMS)
- Mode "debug" pour bypasser en développement
📞 Support
En cas de problème, le salarié voit :
Besoin d'aide ? Contactez-nous à paie@odentas.fr
Le support peut :
- Vérifier que la date de naissance est correcte en base
- Vérifier les logs CloudWatch ou Vercel
- Tester manuellement l'API avec cURL
- Envoyer un nouveau lien si nécessaire
Fonctionnalité ajoutée le 15 octobre 2025
Sécurisation des signatures électroniques - Odentas Espace Paie