Générateur d’en-tête Basic Auth

Saisissez un nom d’utilisateur et un mot de passe pour obtenir l’en-tête Authorization: Basic et une commande curl prête à exécuter, ou collez un en-tête existant pour voir les identifiants qu’il contient.

En-tête Authorization
Commande curl

Décoder un en-tête existant

Fonctionne entièrement dans votre navigateur. Aucune donnée n’est envoyée.

Mode d’emploi

  1. Saisissez le nom d’utilisateur et le mot de passe dans les champs « Nom d’utilisateur » et « Mot de passe ».
  2. Copiez l’en-tête généré sous « En-tête Authorization » dans votre client, ou utilisez la « Commande curl » pour tester la requête.
  3. Pour lire un en-tête existant, collez-le dans la section « Décoder un en-tête existant » : le nom d’utilisateur et le mot de passe s’affichent.

Fonctionnement de l’authentification HTTP Basic

L’authentification Basic est définie par la RFC 7617. Lorsqu’une ressource est protégée, le serveur répond par 401 Unauthorized et un en-tête WWW-Authenticate: Basic realm="...". Le client joint alors le nom d’utilisateur et le mot de passe par un deux-points, encode le résultat en Base64 et l’envoie avec chaque requête :

Authorization: Basic base64(username ":" password)

# Exemple tiré de la RFC 7617 : utilisateur "Aladdin", mot de passe "open sesame"
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Les navigateurs gèrent eux-mêmes cet échange et affichent une boîte de dialogue de connexion, tandis que les scripts et les clients d’API envoient généralement l’en-tête dès la première requête, sans attendre le défi du serveur. Comme le deux-points sépare les deux valeurs, le nom d’utilisateur ne doit pas en contenir ; le mot de passe, si. Un serveur peut ajouter charset="UTF-8" à son défi pour annoncer qu’il attend les identifiants non ASCII en UTF-8.

Base64 n’est pas un chiffrement

L’en-tête paraît brouillé, mais quiconque le voit peut retrouver le mot de passe en quelques secondes, avec le décodeur de cette page ou n’importe quel décodeur Base64. L’authentification Basic n’est acceptable qu’en HTTPS, où TLS chiffre l’en-tête pendant le transit. Gardez également à l’esprit que :

  • les identifiants accompagnent chaque requête, si bien qu’une seule requête en HTTP simple suffit à les exposer ;
  • les proxys, répartiteurs de charge et outils de débogage peuvent journaliser l’en-tête Authorization si on ne leur indique pas le contraire ;
  • les navigateurs mémorisent les identifiants saisis jusqu’à leur fermeture, et il n’existe aucun moyen standard de se déconnecter.

Pour les API publiques, des jetons d’API révocables ou OAuth conviennent mieux. L’authentification Basic reste un choix raisonnable pour les outils internes, les sites de préproduction et les appels de serveur à serveur sur TLS.

Envoyer l’en-tête depuis votre code

# curl construit lui-même l’en-tête
curl -u 'user:password' https://api.example.com/

// fetch en JavaScript (btoa ne gère que les caractères Latin-1)
fetch(url, { headers: { Authorization: 'Basic ' + btoa('user:password') } })

# Python avec requests
requests.get(url, auth=('user', 'password'))

Évitez d’intégrer les identifiants dans l’URL, comme dans https://user:password@host/. La RFC 3986 déconseille cette forme, elle se retrouve dans l’historique du navigateur et dans les journaux des serveurs, et les navigateurs modernes la restreignent.

Questions fréquentes

Comment décoder un en-tête Basic Auth ?

Collez l’en-tête dans la section « Décoder un en-tête existant » : le nom d’utilisateur et le mot de passe apparaissent aussitôt. N’importe quel décodeur Base64 donne le même résultat, et c’est précisément pour cela que l’en-tête ne doit circuler qu’en HTTPS.

Le mot de passe peut-il contenir un deux-points ?

Oui. Le serveur coupe la valeur décodée au premier deux-points : tout ce qui suit appartient au mot de passe. Le nom d’utilisateur, en revanche, ne doit pas contenir de deux-points.

L’authentification HTTP Basic est-elle sûre ?

En HTTPS, avec un mot de passe fort et unique, elle protège les identifiants pendant le transit, mais ceux-ci sont envoyés avec chaque requête et ne peuvent pas expirer comme un jeton. Ne l’utilisez jamais en HTTP simple.

Pourquoi la connexion échoue-t-elle avec un mot de passe contenant des accents ou des caractères non latins ?
Le client et le serveur n’utilisent pas forcément le même encodage de caractères. La RFC 7617 permet au serveur de déclarer charset="UTF-8" ; sans cela, d’anciens serveurs peuvent supposer de l’ISO-8859-1 et comparer des octets différents.
Mon mot de passe est-il envoyé quelque part ?

Non. L’en-tête est construit par du JavaScript dans votre navigateur et rien n’est transmis. Utilisez tout de même des identifiants de test lorsque vous partagez une commande curl générée avec d’autres personnes.