Usage

La Basic Auth (Basic Authentication en 🇬🇧 ou Authentification Basique en 🇫🇷) RFC7617 est l’un des schémas d’authentification de la « structure d’authentification HTTP » et permet de protéger une ressource web (ou URL) par un simple couple login/mot de passe.
En accédant à une URL protégée par une Basic Auth, le navigateur fait apparaître une pop-up demandant les credentials (login/pass).

L’utiliser ou pas ?

Ce mécanisme permet de mettre en place un blocage simple, mais elle est si basique qu’elle peut être sniffée si certaines requêtes ne passent en https car les login et password sont juste encodés en base64 ou simplement brute forcée (si d’autres mécanismes de limitations ne sont pas en place).

  • La basic auth est donc déconseillée 👎 pour sécuriser l’accès à une application web.
  • En revanche elle est adaptée 👍 dans le cas où on souhaite simplement cacher une URL des crawlers (Googlebot etc) pour par exemple éviter l’indexation des sites de recette, pré-prod etc.

Protocole et en-têtes HTTP

La sécurisation par l’authentification basique peut se faire à 2 niveaux de l’infrastructure :

  • Reverse Proxy : par configuration Nginx, Apache ou IIS
  • Serveur Web, programmatiquement : ex Node.js ou .Net

Séquencement

  1. le navigateur commence par effectuer un http GET l’URL protégée par une Basic Auth
  2. en fonction de l’infra qui authentifie (reverse proxy ou serveur web), on reçoit coté client un couple en-tête HTTP / code HTTP différent, mais le schéma d’authentification est défini au niveau de ces en-têtes (ici Basic):
    • du Proxy qui répond avec :
      1. code HTTP 407 (Proxy Authentication Required)
      2. en-tête HTTP : Proxy-Authenticate: Basic realm="Acces restreint"
    • ou du serveur Web qui répond avec :
      1. code HTTP 401 (Unauthorized)
      2. en-tête HTTP : WWW-Authenticate: Basic realm="Acces restreint"
  3. la pop-up d’authentification s’affiche alors dans le Navigateur
    (l’authentification à travers l’URL http://login:pass@exemple.com est dépréciée)
  4. le navigateur encode en base64 la chaîne: « login:pass » et la transmet via un GET (de la même ressource) avec l’en-tête HTTP Authorization
    ex: Authorization: Basic bG9naW46cGFzcw==
  5. le Proxy ou Serveur Web qui gère l’authentification réponds après vérification, soit par une 200 (et tout roule), soit par une 403 (Forbidden)…
  6. le navigateur garde en cache ces credentials et les envois lors de toutes les requêtes HTTP vers ce realm (ici la chaine Acces restreint)
  7. lorsque l’onglet est fermé, le navigateur supprime ces credentials de son cache

Encoder et décoder en base64

Nodejs:

Buffer.from(b64, ‘base64’).toString()

https://nodejs.org/api/buffer.html#buffer_buffer

Navigateur:

atob(b64)

https://developer.mozilla.org/fr/docs/Web/API/WindowOrWorkerGlobalScope#Methods

Express

basic-auth est un middleware Express (Nodejs) qui implémentent la Basic Auth.