A complete RESTful authentication API built with Node.js, Express, and MySQL.
- User registration
- Email/password login
- JWT authentication with access and refresh tokens
- Email verification
- Password reset
- Profile update
- Data validation with Joi
- Error handling
- Logging with Winston
- Email sending with Nodemailer
- Node.js (v20.17+ — required by the test toolchain)
- MySQL (v5.7+)
- npm or yarn
- Clone the repository:
git clone https://github.com/goncoolio/kit.git
cd <folder-name>- Install dependencies:
npm install- Copy .env.example to .env:
cp .env.example .env- Configure environment variables in .env:
# App
APP_NAME="Your App"
NODE_ENV=development
PORT=5200
# JWT
JWT_SECRET=your_jwt_secret
ACCESS_TOKEN_LIFE=30m
REFRESH_TOKEN_LIFE=30d
# Email
SMTP_HOST=your_smtp_host
SMTP_PORT=465
SMTP_EMAIL=your_email
SMTP_PASSWORD=your_password
FROM_NAME="Your App"
FROM_EMAIL=no-reply@yourapp.com- Configure the database in the same .env file (no credentials are stored in the repository):
DB_USERNAME=your_username
DB_PASSWORD=your_password
DB_DATABASE=your_db
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DIALECT=mysql- Create database:
npx sequelize-cli db:create- Run migrations:
npx sequelize-cli db:migrateDevelopment mode:
npm run devProduction mode:
npm startThe test suite runs against an in-memory SQLite database, so no MySQL server
or .env file is required — everything is configured in tests/env.js.
npm test # run the whole suite
npm run test:watch| File | Coverage |
|---|---|
tests/auth.test.js |
registration, login, profile, account status, 404 handling |
tests/tokens.test.js |
token refresh and rotation, token typing, blacklist, logout |
tests/verification.test.js |
email and phone confirmation, code expiry |
tests/password.test.js |
password change and reset flows |
tests/email.test.js |
integration test of sendEmail against a real local SMTP server |
Emails are mocked everywhere except in tests/email.test.js, which starts a
local SMTP server to verify the handlebars template is really compiled and
delivered.
CI runs the suite on Node 20 and 22, and checks that migrations apply and roll
back cleanly (.github/workflows/tests.yml).
All authentication routes are mounted under /auth/user.
POST /auth/user/register- RegisterPOST /auth/user/login- LoginPOST /auth/user/logout- Logout (body:refresh_token)GET /auth/user/profile- Get profile (Bearer access token)PUT /auth/user/update-profile- Update profile (Bearer access token)POST /auth/user/refresh-token- Refresh token (body:refresh_token)PUT /auth/user/change-password- Change password (Bearer access token)POST /auth/user/confirm-email- Confirm email (Bearer access token)POST /auth/user/confirm-tel- Confirm mobile number (Bearer access token)POST /auth/user/reset-password- Request password reset by emailPOST /auth/user/mobile-reset-password- Request password reset by phone numberPUT /auth/user/confirm-password- Confirm password reset
src/
├── config/ # Configurations
├── controllers/ # Controllers
├── Email/ # Email templates
├── middleware/ # Middlewares
├── migrations/ # Database migrations
├── models/ # Sequelize models
├── routes/ # Routes
├── services/ # Services
└── validator/ # Validators
- Passwords hashed with bcrypt
- CORS protection
- Input data validation
- Sensitive routes protected with JWT
- Expired token handling
- Token blacklisting
Logs are generated in the logs/ folder with daily rotation.
Une API RESTful d'authentification complète construite avec Node.js, Express et MySQL.
- Inscription utilisateur
- Connexion avec email/mot de passe
- Authentification JWT avec tokens d'accès et de rafraîchissement
- Vérification d'email
- Réinitialisation de mot de passe
- Mise à jour du profil
- Validation des données avec Joi
- Gestion des erreurs
- Logs avec Winston
- Envoi d'emails avec Nodemailer
- Node.js (v20.17+ — requis par l'outillage de test)
- MySQL (v5.7+)
- npm ou yarn
- Clonez le dépôt :
git clone https://github.com/goncoolio/kit.git
cd <nom-du-dossier>- Installez les dépendances :
npm install- Copiez le fichier .env.example en .env :
cp .env.example .env- Configurez les variables d'environnement dans le fichier .env :
# App
APP_NAME="Votre App"
NODE_ENV=development
PORT=5200
# JWT
JWT_SECRET=votre_secret_jwt
ACCESS_TOKEN_LIFE=30m
REFRESH_TOKEN_LIFE=30d
# Email
SMTP_HOST=votre_host_smtp
SMTP_PORT=465
SMTP_EMAIL=votre_email
SMTP_PASSWORD=votre_password
FROM_NAME="Votre App"
FROM_EMAIL=no-reply@votreapp.com- Configurez la base de données dans ce même fichier .env (aucun identifiant n'est stocké dans le dépôt) :
DB_USERNAME=votre_username
DB_PASSWORD=votre_password
DB_DATABASE=votre_db
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DIALECT=mysql- Créez la base de données :
npx sequelize-cli db:create- Exécutez les migrations :
npx sequelize-cli db:migrateMode développement :
npm run devMode production :
npm startLa suite de tests s'exécute sur une base SQLite en mémoire : aucun serveur
MySQL ni fichier .env n'est nécessaire, tout est configuré dans
tests/env.js.
npm test # lance toute la suite
npm run test:watch| Fichier | Couverture |
|---|---|
tests/auth.test.js |
inscription, connexion, profil, statut du compte, gestion des 404 |
tests/tokens.test.js |
rafraîchissement et rotation des tokens, typage, blacklist, déconnexion |
tests/verification.test.js |
confirmation email et téléphone, expiration des codes |
tests/password.test.js |
changement et réinitialisation du mot de passe |
tests/email.test.js |
test d'intégration de sendEmail contre un vrai serveur SMTP local |
Les emails sont mockés partout sauf dans tests/email.test.js, qui démarre un
serveur SMTP local pour vérifier que le template handlebars est réellement
compilé et remis.
La CI exécute la suite sur Node 20 et 22, et vérifie que les migrations
s'appliquent et se déroulent proprement dans les deux sens
(.github/workflows/tests.yml).
Toutes les routes d'authentification sont montées sous /auth/user.
POST /auth/user/register- InscriptionPOST /auth/user/login- ConnexionPOST /auth/user/logout- Déconnexion (body :refresh_token)GET /auth/user/profile- Obtenir le profil (token d'accès Bearer)PUT /auth/user/update-profile- Mettre à jour le profil (token d'accès Bearer)POST /auth/user/refresh-token- Rafraîchir le token (body :refresh_token)PUT /auth/user/change-password- Changer le mot de passe (token d'accès Bearer)POST /auth/user/confirm-email- Confirmer l'email (token d'accès Bearer)POST /auth/user/confirm-tel- Confirmer le numéro de téléphone (token d'accès Bearer)POST /auth/user/reset-password- Demander la réinitialisation par emailPOST /auth/user/mobile-reset-password- Demander la réinitialisation par téléphonePUT /auth/user/confirm-password- Confirmer la réinitialisation du mot de passe
src/
├── config/ # Configurations
├── controllers/ # Contrôleurs
├── Email/ # Templates d'emails
├── middleware/ # Middlewares
├── migrations/ # Migrations de base de données
├── models/ # Modèles Sequelize
├── routes/ # Routes
├── services/ # Services
└── validator/ # Validateurs
- Mots de passe hashés avec bcrypt
- Protection CORS
- Validation des données entrantes
- Protection des routes sensibles avec JWT
- Gestion des tokens expirés
- Blacklist des tokens
Les logs sont générés dans le dossier logs/ avec rotation quotidienne.
Ousmane Coulibaly
ISC