Catégories
Devops

Basic Auth

Usage

La Basic Auth (authentification basique) 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 une URL protégée par une Basic Auth
  2. en fonction de l’infra qui authentifie, 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 transmet ca via un GET de la même ressource avec l’en-tete 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
  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

express.basicAuth is gone
basic-auth-connect is deprecated
basic-auth doesn’t have any logic
http-auth is an overkill
express-basic-auth is what you want