# Groupe KA — le hub & le KA ID
**Site vitrine du holding + compte unique (KA ID) pour les sept plateformes du groupe.**
[](https://www.groupe-ka.com)
[](https://nextjs.org)
[](https://react.dev)
[](https://www.typescriptlang.org)
[](https://tailwindcss.com)
[](https://sqlite.org)
[](#-authentification)
[](#-authentification)
[-d9f26b?style=flat-square)](#-authentification)
[](#-authentification)
[](#-fonctionnalités)
[](#-sso--un-compte-sept-plateformes)
[](#-routes)
[](#-routes)
[](#-métriques)
[](#-déploiement)
[](#-auteur)
---
## 📸 Aperçu
| Accueil | Connexion (KA ID) |
|:---:|:---:|
|  |  |
## ✨ Fonctionnalités
- 🪪 **KA ID** — identifiant membre unique (`ka-` + 10 chiffres) créé au hub, source de vérité du groupe.
- 🔑 **Trois modes de connexion** : Google OAuth 2.0, Sign in with Apple, courriel + mot de passe (scrypt natif, zéro dépendance).
- 🛰 **SSO maison** vers les 7 plateformes (jeton JWT signé par plateforme, 5 min).
- 👤 **Profil enrichi** (bio, ville, réseaux sociaux, rôle…) affiché par toutes les plateformes, avec page publique `/u/[kaId]`.
- ⭐ **Favoris unifiés** « Mon univers Ka » — magasin central, les plateformes poussent/lisent via `/api/sso/favorites`.
- 💳 **Carte de membre** avec QR code + passe **Apple Wallet** signée (`/api/wallet/pass`).
- 📱 **Menu mobile 100 % CSS** (case à cocher + `peer`, zéro JS) et icône compte directe dans le header.
## 📊 Métriques
| Métrique | Valeur |
|---|---:|
| Lignes TypeScript / TSX | ~5 400 |
| CSS (design system maison) | ~850 lignes |
| Routes API | **17** |
| Pages | **8** |
| Plateformes SSO servies | **7** |
| Dépendances de prod | **7** seulement |
| Base de données | SQLite (WAL), zéro serveur |
## 🔐 Authentification
| Mode | Détails |
|---|---|
| **Google** | OAuth 2.0 code flow, `id_token` vérifié par JWKS (`jose`), liaison par `google_sub` puis courriel |
| **Apple** | Sign in with Apple, retour `form_post`, `client_secret` = JWT ES256 signé à la volée avec la clé `.p8`, liaison par `apple_sub` |
| **Courriel** | scrypt natif Node (`crypto.scryptSync`), comparaison à temps constant |
| **Sessions** | JWT HS256 (`jose`) en témoin HttpOnly `ka_session`, 30 jours |
## 🛰 SSO — un compte, sept plateformes
`/sso/authorize?client=` émet un JWT (5 min) signé avec le secret partagé de la plateforme :
[Lou·Ka](https://www.lou-ka.com) · [Immo·Ka](https://www.immo-ka.com) · [Vrai-Prix](https://www.vrai-prix.com) · [ValoPlex](https://www.valoplex.com) · [Auto·Ka](https://www.auto-ka.com) · [Fabri·Ka](https://www.fabri-ka.com) · [Food·Ka](https://www.food-ka.com)
## 🗂 Routes
**Pages** : `/` · `/connexion` · `/compte` · `/compte/carte` · `/u/[kaId]` · `/m/[kaId]` · `/conditions` · `/confidentialite`
**API** :
| Groupe | Routes |
|---|---|
| Auth | `/api/auth/{login,register,logout,me}` · `/api/auth/{google,apple}` · `/api/auth/callback/{google,apple}` |
| Profil | `/api/profile` · `/api/profile/{role,public,avatar}` |
| SSO | `/sso/authorize` · `/api/sso/{profile,favorites}` |
| Divers | `/api/favorites` · `/api/wallet/pass` · `/api/health` |
## 🧱 Stack
**Next.js 16 (App Router, Turbopack)** · **React 19** · **TypeScript 5** · **Tailwind CSS 4** · **better-sqlite3** (WAL) · **jose** (JWT/JWKS) · **sharp** (avatars) · **qrcode** (carte de membre)
## 🚀 Déploiement
```bash
npm run dev # développement (http://localhost:3000)
npm run build # build de production
npm start # sert le build
```
En production : nœud **M3U96b** du cluster MacLustr, **PM2** (auto-restart) + tunnel **ngrok** → [www.groupe-ka.com](https://www.groupe-ka.com).
Variables d'environnement : `BASE_URL`, `KA_AUTH_SECRET`, `GOOGLE_CLIENT_ID/SECRET`, `APPLE_CLIENT_ID/TEAM_ID/KEY_ID/PRIVATE_KEY`, `KA_SSO_SECRET_*` (une par plateforme), `KA_PASS_*` (Apple Wallet), `KA_DB_PATH`.
## 👤 Auteur
**Simon-Pierre Boucher** — [contact@spboucher.ai](mailto:contact@spboucher.ai) · © 2026 Groupe KA