# Présentation

Le projet exemple est une application web de chat dans laquelle le Seald-SDK est intégré pour ajouter du chiffrement de bout-en-bout.

Ce projet est disponible sur Github (opens new window) :

git clone https://github.com/seald/sdk-example-project.git

Il est subdivisé en plusieurs branches successives qui présentent chacune une étape différente de l'intégration. Des guides décrivant pas-à-pas comment l'implémenter à partir de la version précédente sont disponibles :

Étape Description Résultat final Branche de base
Démarrage rapide Intégration basique du Seald-SDK avec une protection par mot de passe 1-quick-start (opens new window) master (opens new window)
Pré-dérivation du mot de passe Implémente une pré-dérivation du mot de passe d'authentification 2-pre-derivation (opens new window) 1-quick-start (opens new window)
Mise en cache de l'identité en localstorage Implémente une mise en cache de l'identité dans le localstorage 3-localstorage (opens new window) 2-pre-derivation (opens new window)
Génération côté serveur du jeton de licence Génère le jeton de licence côté serveur plutôt que côté client 4-user-license-token (opens new window) 3-localstorage (opens new window)
Protection en 2-man-rule Remplacement de la protection par mot de passe par une protection en 2-man-rule 5-two-man-rule (opens new window) 4-user-license-token (opens new window)

WARNING

Il s'agit d'une application de démonstration destinée exclusivement à présenter l'intégration du Seald-SDK. D'autres considérations — incluant de sécurité — n'ayant pas été prises en compte, nous vous recommandons de ne pas l'utiliser tel quel.

# Fonctionnalités

L'application de chat permet à des utilisateurs de :

  • se créer un compte ;
  • se connecter par mot de passe ;
  • envoyer des messages en privé à n'importe quel autre utilisateur ;
  • créer & administrer un salon de chat ;
  • envoyer des messages dans un salon de chat.

# Lancement

Il s'agit d'une application web en deux parties :

  • un backend dans le dossier ./backend implémenté en Node.js, avec Express & socket.io. Il est connecté à une base de données SQL (SQLite ou Postgres) avec Sequelize comme ORM ;
  • un frontend dans le dossier ./frontend implémenté en React.js en utilisant @material-ui comme bibliothèque d'UI.

Pour installer les dépendances, il suffit de lancer npm install dans les deux dossiers frontend et backend.

# Configuration

# Front-end

La configuration du projet s'effectue par un fichier de configuration settings.json.

Celui-ci doit être placé dans le dossier racine du serveur web (en mode développement, dans le dossier /frontend/public/).

Vous trouverez dans chaque branche un fichier settings.example.json, qui est un modèle du fichier settings.json que vous pouvez copier/coller. Vous devrez modifier les valeurs par les véritables paramètres.

Ce fichier contient les variables :

Nom Description Doit être défini dans les branches
APPLICATION_SALT Sel utilisé pour la pré-dérivation 2-pre-derivation, 3-localstorage, 4-user-license-token
VALIDATION_KEY_ID ID de la clé de validation (pour le jeton de licence) 1-quick-start, 2-pre-derivation, 3-localstorage
VALIDATION_KEY Clé de validation (pour le jeton de licence) 1-quick-start, 2-pre-derivation, 3-localstorage
APP_ID App ID (pour le jeton de licence et SSKS) 1-quick-start, 2-pre-derivation, 3-localstorage, 4-user-license-token, 5-two-man-rule
API_URL Seald API URL 1-quick-start, 2-pre-derivation, 3-localstorage, 4-user-license-token, 5-two-man-rule
KEY_STORAGE_URL API URL (pour SSKS) 1-quick-start, 2-pre-derivation, 3-localstorage, 4-user-license-token, 5-two-man-rule

# Back-end

La configuration du projet s'effectue par un fichier de configuration settings.json.

Par défaut, celui-ci doit être placé à la racine du dossier /backend. Le chemin où l'application cherche ce fichier peut être modifié en mettant le chemin du fichier dans la variable d'environnement CONFIG_FILE.

Vous trouverez dans chaque branche un fichier settings.example.json, qui est un modèle du fichier settings.json que vous pouvez copier/coller. Vous devrez modifier les valeurs par les véritables paramètres.

Ce fichier contient les variables :

Nom Description Doit être défini dans les branches
HTTPS_ENABLED Doit être activé si un reverse proxy implémente HTTPS en amont du serveur. L'attribut Secure sera ajouté aux cookies de session et Express fera confiance aux headers X-Forwarded-* Toutes
SESSION_SECRET Secret utilisé pour dériver les cookies de session Toutes
VALIDATION_KEY_ID ID de la clé de validation (pour le jeton de licence) 4-user-license-token, 5-two-man-rule
VALIDATION_KEY Clé de validation (pour le jeton de licence) 4-user-license-token, 5-two-man-rule
APP_ID App ID (pour le jeton de licence et SSKS) 4-user-license-token, 5-two-man-rule
KEY_STORAGE_URL API URL (pour SSKS) 5-two-man-rule
KEY_STORAGE_APP_KEY Clé d'application (pour SSKS) 5-two-man-rule

# Lancement local

L'application peut être lancée en local en démarrant :

  • le backend avec la commande npm start dans le dossier backend ;
  • le frontend avec la commande npm start dans le dossier frontend.

TIP

Si le backend ou le frontend ne se lance pas correctement, vérifiez que vous avez bien créé le fichier de configuration correspondant, et que vous l'avez correctement rempli.

Un fichier database.sqlite sera automatiquement créé dans le dossier backend, et cela ouvrira deux serveurs :

  • sur le port 4000 pour l'API ;
  • sur le port 3000 qui sert le frontend et agit comme reverse proxy vers l'autre serveur.
Fonctionnement du _watch_

Le backend est lancé à l'aide de nodemon (opens new window) qui le relance dès qu'il y a une modification dans le code du backend.

Le frontend utilise le serveur de développement de react-scripts (opens new window) et dispose aussi d'une fonctionnalité de watch.

TIP

Si vous modifiez les modèles Sequelize, il se peut que vous deviez supprimer le fichier de base de données si les modifications ne sont pas compatibles.

# Déploiement

L'application peut également être déployée en utilisant Docker-Compose :

docker-compose up -d --build

Cela va:

  • construire et lancer une image pour le backend à partir de backend/Dockerfile qui est basée du node:14 et lance le serveur sur le port 4000;
  • construire et lancer une image pour le frontend à partir de frontend/Dockerfile qui build le frontend et le sert statiquement avec nginx, qui agit comme reverse proxy du backend.
  • lancer une image postgres.

TIP

En production, vous devriez définir la variable d'environnement NODE_ENV à "production", pour lancer le serveur express en mode production.