- Implement PKCE (Proof Key for Code Exchange) with S256 method - Add crypto/pkce module with code verifier and challenge generation - Modify OAuth flow to include code_challenge in authorization requests - Update HandleCallback to validate code_verifier during token exchange - Extend session lifetime from 7 to 30 days - Add comprehensive unit tests for PKCE functions - Maintain backward compatibility with fallback for non-PKCE sessions - Add detailed logging for OAuth flow with PKCE tracking PKCE enhances security by preventing authorization code interception attacks, as recommended by OAuth 2.1 and OIDC standards. feat: add encrypted refresh token storage with automatic cleanup - Add oauth_sessions table for storing encrypted refresh tokens - Implement AES-256-GCM encryption for refresh tokens using cookie secret - Create OAuth session repository with full CRUD operations - Add SessionWorker for automatic cleanup of expired sessions - Configure cleanup to run every 24h for sessions older than 37 days - Modify OAuth flow to store refresh tokens after successful authentication - Track client IP and user agent for session security validation - Link OAuth sessions to user sessions via session ID - Add comprehensive encryption tests with security validations - Integrate SessionWorker into server lifecycle with graceful shutdown This enables persistent OAuth sessions with secure token storage, reducing the need for frequent re-authentication from 7 to 30 days.
8.2 KiB
Email Setup
Configuration SMTP pour l'envoi de rappels email aux signataires attendus.
Vue d'Ensemble
Le service email d'Ackify permet d'envoyer des rappels automatiques aux utilisateurs qui n'ont pas encore signé un document.
Fonctionnalités :
- Envoi de rappels multilingues (fr, en, es, de, it)
- Templates HTML et texte brut
- Historique des envois dans PostgreSQL
- Support TLS/STARTTLS
- Timeout configurable
Note : Le service email est optionnel. Si ACKIFY_MAIL_HOST n'est pas défini, les emails sont désactivés.
Configuration de Base
Variables Obligatoires
# Serveur SMTP
ACKIFY_MAIL_HOST=smtp.gmail.com
ACKIFY_MAIL_PORT=587
ACKIFY_MAIL_USERNAME=your-email@gmail.com
ACKIFY_MAIL_PASSWORD=your-app-password
# Adresse expéditeur
ACKIFY_MAIL_FROM=noreply@company.com
Variables Optionnelles
# Nom affiché de l'expéditeur (défaut: ACKIFY_ORGANISATION)
ACKIFY_MAIL_FROM_NAME="Ackify - ACME Corporation"
# Préfixe pour le sujet des emails (optionnel)
ACKIFY_MAIL_SUBJECT_PREFIX="[Ackify]"
# Activer TLS (défaut: true)
ACKIFY_MAIL_TLS=true
# Activer STARTTLS (défaut: true)
ACKIFY_MAIL_STARTTLS=true
# Timeout de connexion (défaut: 10s)
ACKIFY_MAIL_TIMEOUT=10s
# Répertoire des templates email (défaut: templates/emails)
ACKIFY_MAIL_TEMPLATE_DIR=templates/emails
# Langue par défaut pour les emails (défaut: en)
# Langues supportées : en, fr, es, de, it
ACKIFY_MAIL_DEFAULT_LOCALE=fr
Providers SMTP Populaires
Gmail
Configuration :
ACKIFY_MAIL_HOST=smtp.gmail.com
ACKIFY_MAIL_PORT=587
ACKIFY_MAIL_USERNAME=your-email@gmail.com
ACKIFY_MAIL_PASSWORD=your-app-password
ACKIFY_MAIL_TLS=true
ACKIFY_MAIL_STARTTLS=true
Prérequis :
- Activer la validation en 2 étapes sur votre compte Google
- Générer un "App Password" : https://myaccount.google.com/apppasswords
- Utiliser ce mot de passe dans
ACKIFY_MAIL_PASSWORD
SendGrid
ACKIFY_MAIL_HOST=smtp.sendgrid.net
ACKIFY_MAIL_PORT=587
ACKIFY_MAIL_USERNAME=apikey
ACKIFY_MAIL_PASSWORD=your-sendgrid-api-key
ACKIFY_MAIL_FROM=noreply@your-domain.com
ACKIFY_MAIL_TLS=true
Amazon SES
ACKIFY_MAIL_HOST=email-smtp.us-east-1.amazonaws.com
ACKIFY_MAIL_PORT=587
ACKIFY_MAIL_USERNAME=your-smtp-username
ACKIFY_MAIL_PASSWORD=your-smtp-password
ACKIFY_MAIL_FROM=noreply@verified-domain.com
ACKIFY_MAIL_TLS=true
Important : Vérifier votre domaine dans AWS SES avant d'envoyer.
Mailgun
ACKIFY_MAIL_HOST=smtp.mailgun.org
ACKIFY_MAIL_PORT=587
ACKIFY_MAIL_USERNAME=postmaster@your-domain.mailgun.org
ACKIFY_MAIL_PASSWORD=your-mailgun-smtp-password
ACKIFY_MAIL_FROM=noreply@your-domain.com
ACKIFY_MAIL_TLS=true
SMTP Custom (Self-hosted)
ACKIFY_MAIL_HOST=mail.company.com
ACKIFY_MAIL_PORT=587
ACKIFY_MAIL_USERNAME=ackify@company.com
ACKIFY_MAIL_PASSWORD=secure_password
ACKIFY_MAIL_FROM=ackify@company.com
ACKIFY_MAIL_TLS=true
ACKIFY_MAIL_STARTTLS=true
Templates Email
Les templates sont dans /backend/templates/emails/ avec support multilingue.
Structure
templates/emails/
├── fr/
│ ├── reminder.html # Template HTML français
│ └── reminder.txt # Template texte brut français
├── en/
│ ├── reminder.html # Template HTML anglais
│ └── reminder.txt # Template texte brut anglais
└── ...
Variables Disponibles
Dans les templates, vous pouvez utiliser :
{{.RecipientName}} // Nom du destinataire
{{.DocumentID}} // ID du document
{{.DocumentTitle}} // Titre du document
{{.DocumentURL}} // URL du document (si définie dans metadata)
{{.SignURL}} // URL pour signer
{{.OrganisationName}} // Nom de l'organisation
{{.SenderName}} // Nom de l'expéditeur (admin)
Exemple de Template HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Rappel de signature</title>
</head>
<body>
<h1>Bonjour {{.RecipientName}},</h1>
<p>
Vous êtes attendu(e) pour signer le document
<strong>{{.DocumentTitle}}</strong>.
</p>
<p>
<a href="{{.SignURL}}" style="background: #0066cc; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px;">
Signer maintenant
</a>
</p>
<p>
Cordialement,<br>
{{.OrganisationName}}
</p>
</body>
</html>
Personnaliser les Templates
Pour utiliser des templates personnalisés :
ACKIFY_MAIL_TEMPLATE_DIR=/custom/path/to/email/templates
Assurez-vous de conserver la même structure de répertoires (langue/reminder.html).
Envoi de Rappels
Via le Dashboard Admin
- Aller sur
/admin - Sélectionner un document
- Cliquer sur "Expected Signers"
- Sélectionner les destinataires
- Cliquer sur "Send Reminders"
Via l'API
curl -X POST http://localhost:8080/api/v1/admin/documents/doc_id/reminders \
-b cookies.txt \
-H "Content-Type: application/json" \
-H "X-CSRF-Token: YOUR_TOKEN" \
-d '{
"emails": ["user1@company.com", "user2@company.com"],
"locale": "fr"
}'
Réponse :
{
"sent": 2,
"failed": 0,
"errors": []
}
Historique des Rappels
Les envois sont tracés dans la table reminder_logs :
SELECT
recipient_email,
sent_at,
status,
error_message
FROM reminder_logs
WHERE doc_id = 'my_document'
ORDER BY sent_at DESC;
Statuts possibles :
sent- Envoyé avec succèsfailed- Échec d'envoibounced- Rebond (email invalide)
Tester la Configuration
Test Manuel via API
# 1. Se connecter en tant qu'admin
# 2. Ajouter un expected signer avec votre email
curl -X POST http://localhost:8080/api/v1/admin/documents/test_doc/signers \
-b cookies.txt \
-H "Content-Type: application/json" \
-H "X-CSRF-Token: YOUR_TOKEN" \
-d '{
"email": "your-email@company.com",
"name": "Test User"
}'
# 3. Envoyer un rappel test
curl -X POST http://localhost:8080/api/v1/admin/documents/test_doc/reminders \
-b cookies.txt \
-H "Content-Type: application/json" \
-H "X-CSRF-Token: YOUR_TOKEN" \
-d '{
"emails": ["your-email@company.com"],
"locale": "en"
}'
Vérifier les Logs
docker compose logs -f ackify-ce | grep -i mail
Vous devriez voir :
INFO Email sent successfully to: your-email@company.com
Troubleshooting
Erreur "SMTP connection failed"
Vérifier :
ACKIFY_MAIL_HOSTetACKIFY_MAIL_PORTsont corrects- Votre serveur autorise les connexions sortantes sur le port SMTP
ACKIFY_MAIL_TLS=truesi le serveur requiert TLS
Erreur "Authentication failed"
Vérifier :
ACKIFY_MAIL_USERNAMEetACKIFY_MAIL_PASSWORDsont corrects- Pour Gmail : utiliser un "App Password", pas votre mot de passe principal
- Pour SendGrid : le username doit être
apikey
Email non reçu mais status "sent"
Vérifier :
- Dossier spam/courrier indésirable
- SPF/DKIM/DMARC de votre domaine (pour éviter les filtres anti-spam)
- L'adresse
ACKIFY_MAIL_FROMest vérifiée chez votre provider
Template non trouvé
Vérifier :
ACKIFY_MAIL_TEMPLATE_DIRpointe vers le bon répertoire- La structure
{locale}/reminder.htmlexiste - Les fichiers ont les bonnes permissions (readable)
Timeout lors de l'envoi
Augmenter le timeout :
ACKIFY_MAIL_TIMEOUT=30s
Bonnes Pratiques
Production
- ✅ Utiliser un service SMTP dédié (SendGrid, Mailgun, SES)
- ✅ Vérifier votre domaine (SPF, DKIM, DMARC)
- ✅ Utiliser une adresse
noreply@pourACKIFY_MAIL_FROM - ✅ Monitorer les
reminder_logspour détecter les échecs - ✅ Tester régulièrement l'envoi d'emails
Sécurité
- ✅ Ne jamais commiter
ACKIFY_MAIL_PASSWORDdans git - ✅ Utiliser des secrets Docker ou variables d'environnement
- ✅ Restreindre les permissions du compte SMTP
- ✅ Activer TLS/STARTTLS en production
Performance
- Les emails sont envoyés synchrones lors de l'appel API
- Pour de gros volumes, envisager une queue asynchrone
- Limiter le nombre de destinataires par batch (recommandé : < 100)
Désactiver les Emails
Pour désactiver complètement le service email :
# Supprimer ou commenter ACKIFY_MAIL_HOST
# ACKIFY_MAIL_HOST=
Le dashboard admin n'affichera plus les options d'envoi de rappels.