Basic Auth
La Basic Auth (Basic Authentication en 🇬🇧) ou Schéma d'Authentification Basique en 🇫🇷 RFC7617 est l'un des schéma d'authentification HTTP de la "structure d’authentification HTTP" Elle permet de protéger une URL par un simple couple login/mot de passe. Lors de l'accès à 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 (environemens de recette, pré-prod etc)
Protocole et en-têtes HTTP
La sécurisation par l’authentification basique peut se faire à différents niveaux de l’infrastructure, soit au niveau des :
- Reverse Proxy (Nginx, Apache) et même certains CDN qui proposent des fonctionnalités de Proxy comme Akamai
- serveur web Nginx, Apache, IIS
- application web via des framework comme Express, .Net
Séquencement
- le navigateur commence par effectuer un
http GET
l’URL protégée par une Basic Auth - 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 :
- code HTTP
407
(Proxy Authentication Required) - en-tête HTTP :
Proxy-Authenticate: Basic realm="Acces restreint"
- code HTTP
- ou du serveur Web qui répond avec :
- code HTTP
401
(Unauthorized) - en-tête HTTP :
WWW-Authenticate: Basic realm="Acces restreint"
- code HTTP
- du Proxy qui répond avec :
- 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) - 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 HTTPAuthorization
ex:Authorization: Basic bG9naW46cGFzcw==
- 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)… - 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) - lorsque l’onglet est fermé, le navigateur supprime ces credentials de son cache
Encodage et décodage
L'encodage
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.