#!/usr/bin/env python3 """ Script pour générer des clés VAPID pour les notifications push. Usage: python scripts/generate_vapid_keys.py Les clés générées doivent être ajoutées aux variables d'environnement: VAPID_PUBLIC_KEY= VAPID_PRIVATE_KEY= VAPID_CLAIMS_EMAIL=mailto:admin@example.com """ import base64 import os try: from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization except ImportError: print("❌ cryptography n'est pas installé.") print(" Installez-le avec: pip install cryptography") exit(1) def generate_vapid_keys(): """Génère une paire de clés VAPID au format base64url.""" # Générer une clé privée EC P-256 private_key = ec.generate_private_key(ec.SECP256R1(), default_backend()) # Extraire la clé privée brute (32 octets) private_numbers = private_key.private_numbers() private_bytes = private_numbers.private_value.to_bytes(32, byteorder='big') private_key_b64 = base64.urlsafe_b64encode(private_bytes).rstrip(b'=').decode('ascii') # Extraire la clé publique non compressée (65 octets = 0x04 + X + Y) public_key = private_key.public_key() public_bytes = public_key.public_bytes( encoding=serialization.Encoding.X962, format=serialization.PublicFormat.UncompressedPoint ) public_key_b64 = base64.urlsafe_b64encode(public_bytes).rstrip(b'=').decode('ascii') return public_key_b64, private_key_b64 if __name__ == "__main__": print("🔐 Génération des clés VAPID pour Web Push...\n") public_key, private_key = generate_vapid_keys() print("=" * 70) print("Clés VAPID générées avec succès !") print("=" * 70) print() print("Ajoutez ces variables à votre fichier .env ou configuration:") print() print(f'VAPID_PUBLIC_KEY={public_key}') print() print(f'VAPID_PRIVATE_KEY={private_key}') print() print('VAPID_CLAIMS_EMAIL=mailto:admin@lediscord.com') print() print("=" * 70) print() print("⚠️ IMPORTANT:") print(" - Gardez la clé privée SECRÈTE") print(" - Les clés doivent être les mêmes en dev et prod") print(" - Après changement de clés, les utilisateurs devront se réabonner")