> ## Documentation Index
> Fetch the complete documentation index at: https://sandbox.it-centrex.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Authentication

> Apprenez à authentifier vos requêtes vers l'API GIMgar Sud.

Toutes les requêtes vers l'API GIMgar Sud, à l'exception de la génération du token elle-même, doivent être authentifiées. Ce guide explique le flux d'authentification et comment l'implémenter en toute sécurité.

## Vue d'ensemble

GIMgar Sud utilise le protocole **OAuth 2.0** avec le flux `client_credentials` : vous échangez un `client_id` et un `client_secret` contre un **token Bearer** (JWT), que vous incluez ensuite dans l'en-tête `Authorization` de chaque appel.

**1. Récupérez vos identifiants**

Votre `client_id` et votre `client_secret` vous sont fournis par GIM-UEMOA lors de votre intégration à la plateforme.

**2. Générez un token**

Appelez `POST {{baseUrl}}/api/v1/auth/token` avec vos identifiants pour obtenir un `access_token`.

**3. Utilisez le token**

Incluez `Authorization: Bearer {{access_token}}` dans l'en-tête de chaque requête vers les autres endpoints.

**4. Renouvelez avant expiration**

Le token expire après `expires_in` secondes. Générez-en un nouveau proactivement avant qu'il n'expire plutôt que d'attendre une erreur `401`.

## Exemple de requête

```bash cURL theme={null}
curl --request POST \
  --url {{baseUrl}}/api/v1/auth/token \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data grant_type=client_credentials \
  --data client_id={{client_id}} \
  --data client_secret={{client_secret}}
```

```javascript JavaScript theme={null}
const response = await fetch("{{baseUrl}}/api/v1/auth/token", {
  method: "POST",
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
  body: new URLSearchParams({
    grant_type: "client_credentials",
    client_id: "{{client_id}}",
    client_secret: "{{client_secret}}",
  }),
});

const { access_token } = await response.json();
```

La réponse contient votre `access_token`, sa durée de validité (`expires_in`, en secondes) et son type (`token_type`, toujours `Bearer`).

## Utiliser le token

Incluez le token dans l'en-tête `Authorization` de chaque requête vers une API protégée :

```http theme={null}
Authorization: Bearer {{access_token}}
```

## Sécurité des identifiants

**1. Gardez vos identifiants privés**

Ne partagez jamais votre `client_secret` dans du code accessible publiquement (dépôt Git, code côté client, réseaux sociaux).

**2. Appelez le token endpoint depuis un backend**

Le `client_secret` ne doit jamais être exposé côté navigateur ou dans une application mobile. Générez le token depuis un serveur que vous contrôlez.

**3. Utilisez des variables d'environnement**

Stockez `client_id` et `client_secret` dans des variables d'environnement ou un gestionnaire de secrets, jamais en dur dans le code.

**4. Limitez l'accès**

Seules les personnes qui en ont réellement besoin doivent avoir accès à ces identifiants.

**5. Utilisez HTTPS**

Toutes les requêtes doivent transiter en HTTPS pour éviter toute interception du token en transit.

## Réponses d'erreur

| Code http | Cause possible |
| - | - |
| `400` | `grant_type`, `client_id` ou `client_secret` manquant ou invalide. |
| `401` | Token manquant, invalide ou expiré sur un appel vers une API protégée. |
| `500` | Problème serveur lors de la génération du token. |

## Étapes suivantes

> **[Référence API](https://sandbox.it-centrex.com/api-reference/introduction.md)**
>
> Explorez l'ensemble des endpoints disponibles.

> **[Erreurs](https://sandbox.it-centrex.com/getting-started/errors.md)**
>
> Comprenez les codes d'erreur retournés par l'API.

> **[Tester votre intégration](https://sandbox.it-centrex.com/getting-started/testing.md)**
>
> Utilisez le sandbox interactif pour exécuter vos premiers appels.


## OpenAPI

````yaml openapi.json POST /api/v1/auth/token
openapi: 3.0.3
info:
  title: Registre des APIs GIM Gar Sud
  version: 1.0.9-sdk0.3.0
  description: >
    APIs exposées par GIM Gar Sud pour permettre aux Contributeurs Tiers de
    Service Financier (CTSF) de consommer les services de GIMpay : enrôlement
    d'usagers et d'instruments de paiement, opérations financières, OTP,
    consentements, documents d'identité et fidélité.
  contact:
    name: Support intégrateurs GimPay
    email: support@it-centrex.com
servers:
  - url: https://egimgarsud.gimpayapp.com
    variables:
      environnement:
        default: egimgarsud
        description: Sous-domaine de l'environnement (sandbox ou production).
security:
  - bearerAuth: []
tags:
  - name: Authentification
  - name: Wallets
    description: Instruments de paiement (cartes, comptes bancaires, mobile wallets)
  - name: Opérations
  - name: OTP
  - name: Usagers
  - name: Bénéficiaires
  - name: MMP favorites
  - name: Pays
  - name: Contributeurs
  - name: Mini-places de marché
  - name: Services
  - name: Terminaux
  - name: Documents
  - name: Consentements & demandes
paths:
  /api/v1/auth/token:
    post:
      tags:
        - Authentification
      summary: S'authentifier et obtenir un jeton d'accès
      description: >
        Grant OAuth2 `client_credentials`. Seule réponse du contrat qui ne suit
        pas l'enveloppe standard. Pas de refresh token : le renouvellement est
        une nouvelle authentification.
      operationId: getToken
      parameters: []
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              required:
                - grant_type
                - client_id
                - client_secret
              properties:
                grant_type:
                  type: string
                  example: client_credentials
                client_id:
                  type: string
                client_secret:
                  type: string
                  format: password
      responses:
        '200':
          description: Jeton émis.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthTokenResponse'
        '400':
          $ref: '#/components/responses/Error400'
        '500':
          $ref: '#/components/responses/Error500'
      security: []
components:
  schemas:
    AuthTokenResponse:
      type: object
      properties:
        access_token:
          type: string
          description: >-
            Token JWT signé (au format Bearer) à inclure dans l'en-tête
            Authorization des requêtes vers les APIs protégées.
        expires_in:
          type: integer
          description: Durée de vie du jeton (secondes).
        token_type:
          type: string
          example: Bearer
          description: Type du token. Toujours Bearer.
        refresh_expires_in:
          type: integer
          description: Durée de vie du token de rafraîchissement. Toujours 0.
        scope:
          type: string
          description: Liste des portées accordées au token.
        not_before_policy:
          type: integer
          description: >-
            Timestamp Unix indiquant que le token ne doit pas être accepté avant
            ce moment.
    ErrorEnvelope:
      allOf:
        - $ref: '#/components/schemas/ApiEnvelope'
        - type: object
          properties:
            body:
              nullable: true
    ApiEnvelope:
      type: object
      description: Enveloppe standard de toutes les réponses (sauf auth).
      properties:
        message:
          type: string
          description: Message technique décrivant le résultat de l'appel.
        status:
          type: integer
          description: Code de statut HTTP de la réponse.
        timestamp:
          type: string
          format: date-time
          description: Horodatage de la réponse.
  responses:
    Error400:
      description: Requête invalide (champ manquant ou mal formé).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    Error500:
      description: Erreur interne du serveur.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Jeton émis par `POST /api/v1/auth/token`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.