Skip to main content

Authentification

Cette API permet à un usager de créer un compte, de s’authentifier et de gérer son accès à la plateforme Connect My Zone.


Création d’un usager (Inscription)

Cette API permet à un usager de créer un nouveau compte sur la plateforme Connect My Zone.

Endpoint : POST /store

Authentification : Aucune

Headers requis :

Accept: application/json

Content-Type: application/json

Paramètres :

ChampTypeRequisDescription
first_namestringOuiPrénom de l'utilisateur
last_namestringOuiNom de l'utilisateur
emailstringOuiAdresse email
phonestringOuiNuméro de téléphone
passwordstringOuiMot de passe
photofileNonPhoto de profil (image)
acceptPrivacyPolicybooleanOuiAcceptation de la politique de confidentialité

Notes :

  • Le numéro de téléphone doit être unique
  • L’adresse email doit être unique si elle est fournie
  • Le compte est créé avec le statut PENDING
  • Un OTP est automatiquement généré
  • Le token d’accès est retourné immédiatement après l’inscription

Requête :

curl -X POST https://api-services.mazone-test.ansut.ci/auth/v1.0/users/store \
-H "Accept: application/json" \
-F "first_name=John" \
-F "last_name=Doe" \
-F "email=john.doe@example.com" \
-F "phone=0700000000" \
-F "password=password123" \
-F "acceptPrivacyPolicy=true" \
-F "photo=@/chemin/photo.jpg"
  1. Succès - Utilisateur créé (200)

Le code OTP est valide, l'utilisateur est authentifié et reçoit son token d'accès.

{
"error": false,
"message": "Successfully",
"data": {
"user": {
"id": "019e0224-fdda-7074-b959-1851680bcad0",
"last_name": "Abdallah",
"first_name": "Diarra",
"email": "utilisateur@exemple.com",
"phone": "0544411389",
"email_verified_at": "2026-05-07 11:23:33",
"profile": "utilisateur-standard",
"status": "active",
"photo": null
},
"token": {
"value": "33|eal7VIlccnooIKTC9kgmBimAfKYuzIgQP9qyOuHhccd8fb23",
"expiresAt": null
}
}
}

Erreur - Email déjà utilisé (400)

{
"error": true,
"statusCode": 400,
"message": "Un utilisateur avec cet email existe déjà."
}

Erreur - Téléphone déjà utilisé (400)

{
"error": true,
"statusCode": 400,
"message": "Un utilisateur avec ce téléphone existe déjà."
}

Erreur - Profil utilisateur introuvable (400)

{
"error": true,
"statusCode": 400,
"message": "Le profil utilisateur est introuvable."
}

Informations tracées dans les logs

  • Adresse IP
  • User-Agent
  • Email utilisé
  • Téléphone utilisé
  • Nom complet utilisé
  • Action (SIGN_UP)

Notes importantes

  • Le code OTP généré expire après 24 heures
  • Le statut initial du compte est PENDING
  • Le type d’authentification utilisé est PHONE_NUMBER
  • La photo de profil est facultative
  • Le token d’accès est généré automatiquement après inscription

Login

Authentification d'un utilisateur avec son email ou son numéro de téléphone et son mot de passe.

Endpoint : POST /login

Authentification : Aucune

Headers requis :

Accept: application/json

Paramètres :

ChampTypeRequisDescription
emailstringNon*Adresse email de l'utilisateur
phonestringNon*Numéro de téléphone de l'utilisateur
passwordstringOuiMot de passe de l'utilisateur
channelstringNonCanal d'origine (mobile pour l'app mobile)

Notes :

  • Vous devez fournir email ou phone (pas les deux)

Requête avec email:

curl -X POST https://api-services.mazone-test.ansut.ci/auth/v1.0/users/login \
-H "Accept: application/json" \
-F "email=utilisateur@exemple.com" \
-F "password=monMotDePasse123"

Requête avec téléphone :

curl -X POST https://api-services.mazone-test.ansut.ci/auth/v1.0/users/login \
-H "Accept: application/json" \
-F "phone=0102030405" \
-F "password=monMotDePasse123"

Requête avec canal mobile :

curl -X POST https://api-services.mazone-test.ansut.ci/auth/v1.0/users/login \
-H "Accept: application/json" \
-F "email=utilisateur@exemple.com" \
-F "password=monMotDePasse123" \
-F "channel=mobile"
  1. Succès - Compte actif sans 2FA (200)

L'utilisateur est authentifié et reçoit son token d'accès.

{
"error": false,
"message": "Successfully",
"data": {
"user": {
"id": "019e0224-fdda-7074-b959-1851680bcad0",
"last_name": "Abdallah",
"first_name": "Diarra",
"email": "utilisateur@exemple.com",
"phone": "0544411389",
"email_verified_at": "2026-05-07 11:23:33",
"profile": "utilisateur-standard",
"status": "active",
"photo": null
},
"token": {
"value": "33|eal7VIlccnooIKTC9kgmBimAfKYuzIgQP9qyOuHhccd8fb23",
"expiresAt": null
}
}
}
  1. Succès - Compte en attente (pending) ou 2FA activé (200)

Un code OTP à 4 chiffres est envoyé par email à l'utilisateur (valable 5 minutes). La réponse contient uniquement l'email.

"utilisateur@exemple.com"
  1. Erreur - Identifiants incorrects par email (400)
{
"error": true,
"statusCode": 400,
"message": "Email ou mot de passe incorrect"
}
  1. Erreur - Identifiants incorrects par téléphone (400)
{
"error": true,
"statusCode": 400,
"message": "Numéro de téléphone ou mot de passe incorrect"
}
  1. Erreur - Compte temporairement bloqué (400)
{
"error": true,
"statusCode": 400,
"message": "Votre compte est temporairement bloqué. Veuillez réessayer dans X minutes."
}

Après 3 tentatives de connexion échouées consécutives.

Règles de sécurité

RègleValeur
Tentatives maximales avant blocage3 échecs consécutifs
Durée du blocageConfigurable (ex: 3 minutes)
Durée de validité de l'OTP5 minutes

Informations tracées dans les logs :

  • Adresse IP

  • User-Agent

  • Type d'action (tentative, succès, échec, blocage)

Notes importantes

  • Le champ channel=mobile est à utiliser uniquement pour l'application mobile

  • Les comptes avec statut pending ou avec 2FA activée nécessitent une validation OTP

  • Chaque tentative échouée incrémente le compteur interne attempts

  • Après déblocage, le compteur de tentatives est réinitialisé


Envoi d'OTP par email

Cette API permet d'envoyer un code OTP (One-Time Password) à 4 chiffres par email à un utilisateur. Le code est valable 5 minutes.

Endpoint : POST /send-otp

Authentification : Aucune

Headers requis :

Accept: application/json

Content-Type: application/json

Paramètres :

ChampTypeRequisDescription
emailstringOuiAdresse email du compte utilisateur
channelstringNonCanal d'origine (mobile pour l'app mobile)

Requête standard :

curl -X POST https://api-services.mazone-test.ansut.ci/auth/v1.0/users/send-otp \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"email": "utilisateur@exemple.com"
}'

Requête avec canal mobile :

curl -X POST https://api-services.mazone-test.ansut.ci/auth/v1.0/users/send-otp \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"email": "utilisateur@exemple.com",
"channel": "mobile"
}'

Réponses

  1. Succès (200)

Un code OTP à 4 chiffres a été envoyé par email. La réponse contient l'email de l'utilisateur.

{
"error": false,
"statusCode": 200,
"message": "utilisateur@exemple.com"
}
  1. Erreur - Utilisateur non trouvé (400)
{
"error": true,
"statusCode": 400,
"message": "Utilisateur non trouvé."
}
  1. Erreur - Trop de requêtes / Rate limiting (429)

Un délai d'attente est imposé entre deux envois d'OTP pour éviter les abus.

{
"error": true,
"statusCode": 429,
"message": "Trop de tentatives. Veuillez patienter avant de renvoyer un code."
}

Règles de sécurité

RègleValeur
Format de l'OTP4 chiffres (1000 à 9999)
Durée de validité de l'OTP5 minutes
Rate limitingOui (délai entre deux envois)
Clé de cache rate limitingotp:send:email

Vérification de numéro de téléphone

Cette API permet de vérifier un numéro de téléphone et d'envoyer un code OTP (One-Time Password) à 4 chiffres par SMS. Le code est valable 5 minutes.

Endpoint : POST /verify-phone

Authentification : Aucune

Headers requis :

Accept: application/json

Content-Type: application/json

Paramètres :

ChampTypeRequisDescription
phonestringOuiNuméro de téléphone à vérifier

Requête standard :

curl -X POST https://api-services.mazone-test.ansut.ci/auth/v1.0/users/verify-phone \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"phone": "0102030405"
}'

Réponses

  1. Succès (200)

Un code OTP à 4 chiffres a été envoyé par email. La réponse contient l'email de l'utilisateur.

{
"error": false,
"statusCode": 200,
"message": "ok"
}
  1. Succès - Numéro déjà existant (200)
{
"error": false,
"statusCode": 200,
"message": "EXISTE"
}
  1. Erreur - Trop de requêtes / Rate limiting (429)

Un délai d'attente est imposé entre deux envois d'OTP pour éviter les abus.

{
"error": true,
"statusCode": 429,
"message": "Trop de tentatives. Veuillez patienter avant de renvoyer un code."
}

Validation d'OTP par téléphone

Cette API permet de valider un code OTP envoyé par SMS pour confirmer un numéro de téléphone.

Endpoint : POST /validate-otp-phone

Authentification : Aucune

Headers requis :

Accept: application/json

Content-Type: application/json

Paramètres :

ChampTypeRequisDescription
phonestringOuiNuméro de téléphone
otpstringOuiCode OTP à 4 chiffres reçu par SMS

Requête :

curl -X POST https://api-services.mazone-test.ansut.ci/auth/v1.0/users/validate-otp-phone \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"phone": "0102030405",
"otp": "1234"
}'

Réponses

  1. Succès (200)

Le code OTP est valide et a été supprimé.

{
"error": false,
"statusCode": 200,
"message": "true"
}
  1. Erreur - Aucun code OTP trouvé (400)
{
"error": true,
"statusCode": 400,
"message": "Aucun code OTP trouvé pour ce numéro de téléphone."
}
  1. Erreur - Code OTP incorrect (400)
{
"error": true,
"statusCode": 400,
"message": "Code OTP incorrect pour ce numéro."
}
  1. Erreur - Code OTP expiré (400)
{
"error": true,
"statusCode": 400,
"message": "Code OTP expiré."
}

Comportement détaillé

Validation : Le numéro de téléphone est validé et parsé

Recherche OTP : Recherche d'un enregistrement OTP non validé pour ce numéro dans la table otp_codes

Vérification existence : Si aucun enregistrement trouvé → erreur

Vérification code : Si le code OTP ne correspond pas → erreur

Vérification expiration : Si l'OTP a expiré (plus de 5 minutes) → erreur

Suppression : L'enregistrement OTP est supprimé définitivement

Réponse : Retourne true


Validation d'OTP par email (connexion)

Cette API permet de valider un code OTP reçu par email pour finaliser l'authentification d'un utilisateur avec un compte en statut pending ou avec 2FA activée.

Endpoint : POST /validate-otp

Authentification : Aucune

Headers requis :

Accept: application/json

Content-Type: application/json

Paramètres :

ChampTypeRequisDescription
emailstringOuiAdresse email de l'utilisateur
otpstringOuiCode OTP à 4 chiffres reçu par email

Requête :

curl -X POST https://api-services.mazone-test.ansut.ci/auth/v1.0/users/validate-otp \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"email": "utilisateur@exemple.com",
"otp": "1234"
}'

Réponses

  1. Succès - Authentification complète (200)

Le code OTP est valide, l'utilisateur est authentifié et reçoit son token d'accès.

{
"error": false,
"message": "Successfully",
"data": {
"user": {
"id": "019e0224-fdda-7074-b959-1851680bcad0",
"last_name": "Abdallah",
"first_name": "Diarra",
"email": "utilisateur@exemple.com",
"phone": "0544411389",
"email_verified_at": "2026-05-07 11:23:33",
"profile": "utilisateur-standard",
"status": "active",
"photo": null
},
"token": {
"value": "33|eal7VIlccnooIKTC9kgmBimAfKYuzIgQP9qyOuHhccd8fb23",
"expiresAt": null
}
}
}
  1. Erreur - Utilisateur non trouvé (400)
{
"error": true,
"statusCode": 400,
"message": "Utilisateur non trouvé."
}
  1. Erreur - Code OTP incorrect (400)
{
"error": true,
"statusCode": 400,
"message": "Code OTP incorrect"
}
  1. Erreur - Code OTP expiré (400)
{
"error": true,
"statusCode": 400,
"message": "Code OTP expiré"
}

Comportement détaillé

Validation : L'email est validé et parsé

Recherche utilisateur : L'utilisateur est recherché par son email

Vérification existence : Si l'utilisateur n'existe pas → erreur

Vérification code OTP : Si le code ne correspond pas → erreur

Vérification expiration : Si l'OTP a expiré (plus de 5 minutes) → erreur

Nettoyage OTP : Suppression de l'OTP et de sa date d'expiration

Activation du compte :

Statut passe à active

email_verified_at est défini (si non déjà fait)

Déblocage : Le compte est débloqué si nécessaire

Génération token : Création d'un token d'authentification

Log : Enregistrement de la connexion dans les logs

Réponse : Retourne les informations utilisateur et le token


Social Login

Authentification d’un utilisateur via un provider OAuth (google ou facebook).

Cette API permet :

  • de rediriger l’utilisateur vers Google ou Facebook
  • de créer automatiquement un compte si l’utilisateur n’existe pas
  • de connecter un utilisateur existant
  • de générer automatiquement un token d’accès
  • de rediriger le frontend ou l’application mobile avec les informations utilisateur

Redirect vers le provider

Endpoint : GET /auth/{provider}/redirect

Authentification : Aucune

Headers requis :

Providers supportés :

  • google
  • facebook

Headers requis : Accept: application/json

Paramètres :

ChampTypeRequisDescription
providerstringOuiProvider OAuth (google ou facebook)
channelstringNonCanal d’origine (mobile pour application mobile)

Requête Google

curl -X GET "https://api-services.mazone-test.ansut.ci/auth/v1.0/users/google/redirect" \
-H "Accept: application/json"

Requête Facebook

curl -X GET "https://api-services.mazone-test.ansut.ci/auth/v1.0/users/facebook/redirect" \
-H "Accept: application/json"

Requête Mobile

curl -X GET "https://api-services.mazone-test.ansut.ci/auth/v1.0/users/google/redirect?channel=mobile" \
-H "Accept: application/json"

Callback Provider

Endpoint appelé automatiquement après authentification Google ou Facebook.

Endpoint : GET /{provider}/callback

Authentification : Aucune

Fonctionnement

Lors du callback :

  • les informations utilisateur sont récupérées depuis le provider
  • un compte utilisateur est créé automatiquement si nécessaire
  • le compte est connecté automatiquement
  • un token API est généré
  • l’utilisateur est redirigé vers le frontend ou l’application mobile
  • Création automatique du compte

Si l’utilisateur n’existe pas :

  • un compte est créé automatiquement
  • le statut initial est INACTIVE
  • l’email est automatiquement vérifié
  • une photo de profil est récupérée depuis le provider
  • un mot de passe aléatoire est généré

Payload retourné

Le paramètre data contient une réponse encodée en Base64.

{
"user": {
"id": "019e0224-fdda-7074-b959-1851680bcad0",
"last_name": "Doe",
"first_name": "John",
"email": "john.doe@example.com",
"phone": null,
"email_verified_at": "2026-05-10 12:00:00",
"profile": "utilisateur-standard",
"status": "INACTIVE",
"photo": "https://lh3.googleusercontent.com/avatar.jpg",
"auth_type": "GOOGLE"
},
"token": {
"value": "33|eal7VIlccnooIKTC9kgmBimAfKYuzIgQP9qyOuHhccd8fb23",
"expiresAt": null
}
}

Erreur - Email manquant depuis le provider (400)

{
"error": true,
"statusCode": 400,
"message": "Email manquant depuis le provider."
}

Erreur - Profil utilisateur introuvable (400)

{
"error": true,
"statusCode": 400,
"message": "Le profil utilisateur est introuvable."
}

Informations tracées dans les logs

  • Adresse IP
  • User-Agent
  • Email utilisé
  • Téléphone utilisé
  • Nom complet utilisé
  • Action (LOGIN)

Notes importantes

  • Les providers supportés sont google et facebook
  • L’authentification utilise OAuth2 via Laravel Socialite
  • Les comptes créés automatiquement ont le statut INACTIVE
  • L’email utilisateur est automatiquement vérifié
  • Le token API est généré automatiquement après connexion
  • Le paramètre channel=mobile doit être utilisé pour les applications mobiles
  • Le payload retourné dans l’URL est encodé en Base64

Déconnexion

Cette API permet à un utilisateur de se déconnecter en révoquant son token d'authentification actuel.

Endpoint : PUT /logout

Authentification : Bearer Token

Headers requis : Accept: application/json

Requête :

curl -X PUT https://api-services.mazone-test.ansut.ci/auth/v1.0/users/logout \
-H "Authorization: Bearer 33|eal7VIlccnooIKTC9kgmBimAfKYuzIgQP9qyOuHhccd8fb23" \
-H "Accept: application/json"

Réponse succès (200) :

{
"error": false,
"message": "Déconnexion réussie."
}