# Authentification HTTP

L'authentification HTTP ou identification HTTP (spécifiée par RFC 2617) permet de s'identifier auprès d'un serveur HTTP en lui montrant que l'on connaît le nom d'un utilisateur et son mot de passe, afin d'accéder aux ressources à accès restreint de celui-ci.

## Fonctionnement général

Lorsqu'un client HTTP demande une ressource protégée au serveur, celui-ci répond de différente façon selon la requête :
* soit la requête ne contient pas d'en-tête HTTP d'identification, dans ce cas le serveur répond avec le code HTTP 401 (Unauthorized : non autorisé) et envoie les en-têtes d'information sur l'identification demandée,
* soit la requête contient les en-têtes HTTP d'identification, dans ce cas, après vérification du nom et du mot de passe, si l'identification échoue, le serveur répond par le code 401 comme dans le cas précédent, sinon il répond de manière normale (code 200 OK).

## Méthodes

Il existe deux méthodes définies par la spécification RFC 2617 :
* la méthode « Basic »,
* la méthode « Digest ».

### Méthode « Basic »

Cette méthode est la plus simple, mais également la moins sécurisée car elle transmet le mot de passe codé en base 64 qui se décode aisément. Elle n'est recommandée qu'avec une connexion chiffrée (protocole HTTPS).
Le serveur ne recevant pas d'en-tête d'identification correcte envoie ce genre d'en-tête HTTP :
Le serveur indique la méthode requise (Basic), suivie des paramètres. La méthode « Basic » ne requiert que le paramètre « realm » identifiant le domaine de protection.
Le client HTTP peut alors réessayer la requête en spécifiant l'en-tête HTTP « Authorization ». Celui-ci doit contenir la méthode utilisée (Basic) suivie de la représentation en Base64 du nom de l'utilisateur et du mot de passe séparés par le caractère « : » (deux-points).
Par exemple, pour authentifier l'utilisateur « Aladdin » avec le mot de passe « open sesame », le client envoie :
QWxhZGRpbjpvcGVuIHNlc2FtZQ== étant la représentation en Base64 du texte Aladdin:open sesame.

### Méthode « Digest »

Cette méthode ne transmet pas le mot de passe en clair, mais impose de stocker celui-ci (ou son hachage SHA1, qui suffit pour s'identifier et peut donc être considéré comme un mot de passe) en clair. Même si cette méthode est plus sûre que la méthode « Basic », elle reste tout de même sensible aux attaques (interception de communication…), et plus sensible encore à certaines attaques (vol de fichier de mots de passe).
La méthode « Digest » est plus complexe et emploie plus de paramètres.

#### Demande d'identification

Le serveur peut envoyer une demande d'identification du genre :
Les paramètres sont séparés par une virgule et sont les suivants :

##### realm

    Ce paramètre est affiché à l'utilisateur pour qu'il sache quel nom et mot de passe il peut utiliser. La chaîne doit au moins contenir le nom de la machine et le nom du groupe d'utilisateurs requis.

##### domain

    (optionnel) Contient une liste d'URI séparés par le caractère espace, définissant le domaine de protection. Ce paramètre donne la liste des URI pour lesquels l'utilisateur demandé est valable.

##### nonce

    Chaîne générée par le serveur à chaque réponse 401. Il est conseillé que cette chaîne utilise les caractères Base64 ou hexadécimaux. Ce paramètre est utilisé dans le calcul de la réponse du client.

##### opaque

    (optionnel) Chaîne générée par le serveur que le client doit retourner telle quelle.

##### stale

    (optionnel) Ce paramètre a 2 valeurs possibles : true ou false. Il vaut true si la demande d'identification précédente a été rejetée seulement à cause de l'utilisation d'une ancienne valeur du paramètre « nonce », false sinon. La valeur true indique que le client doit retenter la requête en utilisant la nouvelle valeur de nonce fournie par le serveur sans redemander un nom et un mot de passe à l'utilisateur.

##### algorithm

    (optionnel) Indique l'algorithme à utiliser pour les fonctions de hashages. Deux valeurs sont définies dans RFC 2617 : MD5 ou MD5-sess.

##### qop

    (optionnel) (Quality Of Protection) Ce paramètre indique les niveaux de protection supportés : auth ou auth-int.

#### Identification du client

Le client s'identifiant avec la méthode « Digest » utilise deux fonctions pour calculer certains paramètres :
La fonction H retourne sous la forme d'une chaîne de caractères (format hexadécimal, en minuscule) le résultat de la fonction de hashage MD5. Elle peut également utiliser un autre algorithme de hashage (SHA par exemple). L'algorithme employé est spécifié dans le paramètre « algorithm ».
La fonction KD appelle la fonction H avec comme argument la concaténation des deux paramètres secret et data séparés par le signe deux-points.
Le client envoie donc l'en-tête « Authorization » contenant le nom de la méthode « Digest » suivi des paramètres :

##### username

    Nom de l'utilisateur.

##### realm

    Même valeur que celle de la réponse du serveur.

##### nonce

    Même valeur que celle de la réponse du serveur.

##### algorithm

    Même valeur que celle de la réponse du serveur.

##### opaque

    Même valeur que celle de la réponse du serveur.

##### uri

    URI de la ressource protégée demandée (dupliquée ici car certains proxy peuvent modifier l'URI originale).

##### response

    Ce paramètre contenant 32 chiffres hexadécimaux représentant la valeur calculée par le client prouvant qu'il connaît le mot de passe.

##### qop

    (optionnel) (Quality Of Protection) Ce paramètre indique le niveau de protection appliqué. Il doit correspondre à l'une des valeurs retournées par le serveur.

##### cnonce

    (si qop est présent) Chaîne générée par le client.

##### nc

    (si qop est présent) (Nonce Count) 8 chiffres hexadécimaux représentant le nombre de fois que la valeur du paramètre « nonce » retournée par le serveur a été utilisée par le client. nc=00000001 la première fois.
Le calcul de la valeur du paramètre response est effectué de la manière suivante :
Si qop est spécifié :
Sinon :
Si algorithm vaut MD5 ou n'est pas spécifié :
si algorithm vaut MD5-sess :
Si qop vaut auth ou n'est pas spécifié :
si qop vaut auth-int :

#### Réponse du serveur

Le serveur recalcule les mêmes valeurs que le client pour vérifier si l'identification est réussie.
Dans le cas où le serveur répond positivement (utilisateur et mot de passe corrects), il envoie, dans la réponse, l'en-tête HTTP « Authentication-Info » contenant des informations sur l'identification réussie et la prochaine identification.
Cet en-tête contient également une liste de paramètres séparés par une virgule :

##### nextnonce

    Valeur à utiliser pour les prochaines identifications dans ce domaine de protection.

##### qop

    (Optionnel) quality of protection appliquée à cette réponse. Ce paramètre doit avoir la même valeur que dans la requête du client.

##### rspauth

    (Si qop spécifié) Ce paramètre d'identification mutuel sert à prouver que le serveur connaît également l'utilisateur et son mot de passe. Il est calculé de la même manière que le paramètre response excepté pour la valeur de A2 où http-method est une chaîne vide.

##### cnonce

    (Si qop spécifié) Même valeur que dans la requête du client.

##### nc

    (Si qop spécifié) Même valeur que dans la requête du client.

## Identification sur serveur mandataire (Proxy)

L'identification décrite ci-dessus se déroule entre l'utilisateur et le serveur d'origine:
Il est également possible de s'identifier auprès des serveurs intermédiaires :
* Utilisateur à proxy
* Proxy à proxy
* Proxy à serveur d'origine.
Pour cela, les en-têtes HTTP Proxy-Authenticate et Proxy-Authorization sont utilisés à la place des en-têtes WWW-Authenticate et Authorization. Le code d'état HTTP 407 est utilisé au lieu du code 401.
L'en-tête Proxy-Authentication-Info a le même rôle que l'en-tête Authentication-Info.
Un client peut devoir s'identifier à la fois à un proxy et au serveur d'origine, mais pas dans la même réponse.
L'identification ne peut être utilisée dans le cas d'un proxy transparent