# Erreur WhatsApp 0 : authentification impossible, solution

URL: https://wa.genuka.com/docs/errors/0
Language: French

> Erreur WhatsApp 0 « We were unable to authenticate the app user » : jeton expiré, invalidé ou accès coupé. Comment la corriger, et le cas Genuka WA.

L'erreur WhatsApp 0 signifie que Meta n'a pas pu authentifier l'utilisateur derrière le jeton
d'accès. En pratique, le jeton a expiré, a été invalidé, ou son propriétaire a interdit aux
applications d'accéder à ses données. Elle se corrige comme une erreur 190 : avec un nouveau jeton,
de préférence un jeton d'utilisateur système.

## Que signifie l'erreur 0 ?

C'est la première ligne des erreurs d'autorisation de la Cloud API :

> « We were unable to authenticate the app user. »
> — [Meta, codes d'erreur de la Cloud API](https://developers.facebook.com/documentation/business-messaging/whatsapp/support/error-codes#authorization-errors)

Meta l'explique ainsi : « Typically this means the included access token has expired, been
invalidated, or the app user has changed a setting to prevent all apps from accessing their
data. » La solution proposée est d'obtenir un nouveau jeton, en renvoyant vers les jetons
d'utilisateur système. La documentation générale de Graph décrit le même symptôme pour les erreurs
de type `OAuthException` sans sous-code : connexion ou jeton expiré, révoqué ou invalide
([Meta, Graph API, gestion des erreurs](https://developers.facebook.com/docs/graph-api/guides/error-handling)).

### Erreur 0 ou erreur 190 ?

|                         | Erreur 0                                              | Erreur 190                                |
| ----------------------- | ----------------------------------------------------- | ----------------------------------------- |
| Libellé Meta            | « We were unable to authenticate the app user. »      | « Your access token has expired. »        |
| Ce qui est en cause     | L'utilisateur derrière le jeton, ou le jeton lui-même | Le jeton, arrivé à expiration ou invalidé |
| Remède indiqué par Meta | Un nouveau jeton                                      | Un nouveau jeton                          |

Dans les deux cas, la même requête avec le même jeton échouera toujours.

## Quand l'erreur 0 apparaît-elle ?

* **Le jeton a expiré ou a été invalidé**, par exemple un jeton utilisateur généré depuis la page
  API Setup du tableau de bord d'app, que Meta fait expirer en quelques heures
  ([Meta, Access tokens](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#user-access-tokens)).
* **Le jeton dépend d'une personne qui a changé ses réglages.** Un jeton utilisateur est lié au
  compte Facebook de celui qui l'a généré : s'il coupe l'accès des applications à ses données, le
  jeton cesse de fonctionner.
* **Le jeton a été révoqué** côté Meta.

### Où la voir dans Genuka WA ?

Genuka WA range l'erreur 0 dans la classe `config` et la traite comme un identifiant mort : dans une
campagne `MARKETING`, elle ne déclenche pas le repli de l'API Marketing Messages vers `/messages`,
qui ne ferait que doubler l'échec et masquer la vraie cause.

```json title="409 — POST /api/v1/messages"
{
  "error": "send_config",
  "message": "We were unable to authenticate the app user.",
  "meta": {
    "errorClass": "config",
    "retryable": false,
    "code": 0,
    "traceId": "AbC…"
  }
}
```

Sur `POST /api/v1/templates`, la même erreur revient en `403 meta_rejected`.

## Comment corriger l'erreur 0 ?

### Si vous passez par Genuka WA

Vous n'avez aucun jeton Meta à renouveler : chaque appel sur votre numéro part avec le jeton
d'utilisateur système de Genuka, qui ne dépend d'aucune personne et n'a pas de date d'expiration.
Une erreur 0 relève donc de Genuka.

1. **Arrêtez les réessais.** `retryable: false` : rien ne changera tant que le jeton n'aura pas
   changé.
2. **Écrivez au support Genuka** avec l'en-tête `x-request-id` et `meta.traceId`.
3. **Vérifiez le numéro** avec `GET /api/v1/connections`. `disconnected` signifie que Meta a
   signalé le compte comme n'étant plus partagé avec Genuka, ou supprimé, ou que vous avez libéré
   le numéro vous-même. Un client qui a retiré l'accès le rétablit par le
   [lien de connexion](https://wa.genuka.com/docs/onboarding) ; un numéro libéré demande de nouveau une place libre ; un
   compte supprimé ou désactivé par Meta ([erreur 368](https://wa.genuka.com/docs/errors/368)) ne se rétablit pas
   ainsi. L'événement `account_update` relayé à vos webhooks dit lequel de ces cas s'applique.

### Si vous appelez la Cloud API avec votre propre jeton

1. **Passez le jeton au débogueur.** Le
   [débogueur de jetons](https://developers.facebook.com/tools/debug/accesstoken/) indique s'il est
   encore valide, à qui il appartient et quelles permissions il porte.
2. **Remplacez-le par un jeton d'utilisateur système.** Meta les décrit comme durables et capables de
   représenter un service automatisé sans action d'un utilisateur, à l'inverse des jetons
   utilisateur ([Meta, Access tokens](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens#system-user-access-tokens)).
   Générez-le avec `business_management`, `whatsapp_business_management` et
   `whatsapp_business_messaging`.
3. **Assignez-lui les comptes.** Sans accès au compte WhatsApp et au compte de messagerie, le nouveau
   jeton recevra une erreur [200](https://wa.genuka.com/docs/errors/200) au lieu de 0.

## Comment éviter l'erreur 0 ?

* **Aucun jeton personnel en production.** Le départ d'un salarié, un mot de passe changé ou un
  réglage de confidentialité ne doivent pas pouvoir couper vos envois.
* **Surveillez la classe `config`.** Chez Genuka WA, une hausse soudaine de réponses
  `meta.errorClass: "config"` sur plusieurs numéros à la fois signale un problème d'identifiants,
  pas un problème de contenu.
* **Gardez une trace de `traceId`.** C'est ce que demande le support de Meta, et l'identifiant
  expire rapidement selon la documentation de Graph.

## Quels codes sont liés ?

* [190](https://wa.genuka.com/docs/errors/190) : le jeton a expiré.
* [200](https://wa.genuka.com/docs/errors/200) : le jeton est valide mais n'a pas accès au compte ou à la permission.
* [10](https://wa.genuka.com/docs/errors/10) : permission non accordée ou retirée.
* [3](https://wa.genuka.com/docs/errors/3) : capacité ou permission manquante pour cet endpoint.

## FAQ

### Faut-il réessayer un appel refusé avec l'erreur 0 ?

Non. Le jeton est en cause : la même requête échouera à l'identique jusqu'à son remplacement.

### Ma clé API Genuka est-elle compromise ?

Non. L'erreur 0 concerne le jeton Meta, pas votre clé `pk_live_…`. Une clé refusée produit un
`401 invalid_token` de Genuka.

### Pourquoi mon jeton fonctionnait-il hier ?

Parce qu'un jeton utilisateur expire en quelques heures, ou cesse de fonctionner dès que son
propriétaire change ses réglages. Un jeton d'utilisateur système n'a pas ce défaut.

## Sources

* [Meta — Error codes](https://developers.facebook.com/documentation/business-messaging/whatsapp/support/error-codes)
* [Meta — Access tokens](https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens)
* [Meta — Graph API, Handling errors](https://developers.facebook.com/docs/graph-api/guides/error-handling)
