# Groupe KA — le hub & le KA ID **Site vitrine du holding + compte unique (KA ID) pour les sept plateformes du groupe.** [![Site](https://img.shields.io/website?url=https%3A%2F%2Fwww.groupe-ka.com&up_message=en%20ligne&down_message=hors%20ligne&label=groupe-ka.com&style=flat-square)](https://www.groupe-ka.com) [![Next.js](https://img.shields.io/badge/Next.js-16.3-000000?style=flat-square&logo=nextdotjs&logoColor=white)](https://nextjs.org) [![React](https://img.shields.io/badge/React-19.2-087EA4?style=flat-square&logo=react&logoColor=white)](https://react.dev) [![TypeScript](https://img.shields.io/badge/TypeScript-5-3178C6?style=flat-square&logo=typescript&logoColor=white)](https://www.typescriptlang.org) [![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-4-06B6D4?style=flat-square&logo=tailwindcss&logoColor=white)](https://tailwindcss.com) [![SQLite](https://img.shields.io/badge/SQLite-WAL-003B57?style=flat-square&logo=sqlite&logoColor=white)](https://sqlite.org) [![Google OAuth](https://img.shields.io/badge/Connexion-Google_OAuth_2.0-4285F4?style=flat-square&logo=google&logoColor=white)](#-authentification) [![Sign in with Apple](https://img.shields.io/badge/Connexion-Sign_in_with_Apple-000000?style=flat-square&logo=apple&logoColor=white)](#-authentification) [![JWT](https://img.shields.io/badge/Sessions-JWT_HS256_(jose)-d9f26b?style=flat-square)](#-authentification) [![scrypt](https://img.shields.io/badge/Mots_de_passe-scrypt_natif-1c5c41?style=flat-square)](#-authentification) [![Apple Wallet](https://img.shields.io/badge/Carte_membre-Apple_Wallet-999999?style=flat-square&logo=apple&logoColor=white)](#-fonctionnalités) [![Plateformes SSO](https://img.shields.io/badge/SSO-7_plateformes-1c5c41?style=flat-square)](#-sso--un-compte-sept-plateformes) [![Routes API](https://img.shields.io/badge/API-17_routes-141814?style=flat-square)](#-routes) [![Pages](https://img.shields.io/badge/Pages-8-141814?style=flat-square)](#-routes) [![Code](https://img.shields.io/badge/TS%2FTSX-~5_400_lignes-141814?style=flat-square)](#-métriques) [![PM2](https://img.shields.io/badge/Prod-PM2_+_ngrok-2B037A?style=flat-square&logo=pm2&logoColor=white)](#-déploiement) [![Licence](https://img.shields.io/badge/©_2026-Simon--Pierre_Boucher-d9f26b?style=flat-square)](#-auteur)
--- ## 📸 Aperçu | Accueil | Connexion (KA ID) | |:---:|:---:| | ![Accueil](assets/screenshots/accueil.png) | ![Connexion](assets/screenshots/connexion.png) |
Vue mobile — icône compte directement dans le header
## ✨ 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