Introduction - Les paramètres - Redirection - Les Images - protection par mot de passe - Les cookies - Base de données - FAQ

Programmes CGI avec Delphi et Kylix - La protection par mot de passe


Ce que l'on sait déjà

Lorsque le programme CGI renseigne l'entête CGI, le serveur la complète avec divers informations; notamment il indique que la requête c'est bien déroulée :
  HTTP/1.0 200 OK
 

Ce qu'il faut savoir

Si vous utiliser mon "browser web text" (voir page delphi), vous verrez que l'entête HTTP d'un site sécurisé est un peu particulière :
  HTTP/1.0 401 Unauthorized
  Content-type: text/html
  WWW-Authenticate: Basic realm="/MyRealm"

  <html><head><title>401 Unauthorized</title></head><body>

  <h1>You need a password to access this page !</h1>
  </body></html>
 
ici le serveur renvoie l'erreur 401 Unauthorized, dès lors votre browser sait qu'il se trouve sur un site protégé. Sans afficher d'erreur il va vous demander le mot de passe pour le domaine précisé (realm="/MyRealm"). Si vous saisissez un profile/mot de passe valide pour le serveur, celui-ci vous donnera accès à la page désirée, sinon le browser affiche le message qui suit l'entête 401.

vous n'avez pas tout compris, bon, relisez tranquillement toute l'info y est !

L'entête HTTP

Si vous avez compris ce qui précède, vous êtes déjà en train de saisir le programme suivant :
 Program EssaiPWD;
 {$apptype console}
 begin

  WriteLn('HTTP/1.0 401 Unauthorized');
  WriteLn('Content-type: text/html');
  WriteLn('WWW-Authenticate: Basic realm="/Essai"');
  WriteLn;
  WriteLn('mot de passe s.v.p.');
 end;
 
...et vous ralez déjà contre votre serveur (ou contre moi), car ça marche pas ! Pas de panique ! C'est normal, je vous avais déjà dit que le serveur complétait l'entête HTTP... et bien, le CGI ci-dessus arrive sur le browser de cette façon :
  HTTP/1.0 200 OK
  HTTP/1.0 401 Unauthorized
  Content-type: text/html
  WWW-Authenticate: Basic realm="/Essai"
 
  mot de passe s.v.p.
 
La première ligne indique donc que la requête se passe bien (merci le serveur), la seconde est ignorée. J'ai pas mal galèré pour trouver comment éviter ça, finalement la réponse est tout simplement dans la norme CGI : le nom du CGI doit commencer par "nph-" s'il gère lui même l'entête HTTP.

Et voilà, tout est dit, il suffit de renommer le programme ci-dessus en "NPH-ESSAIPWD.EXE" et ça marche !

Enfin, ça marche presque puisque le mot de passe n'est pas validé !

WWW-Authenticate

Alors, le browser reçoit une demande d'authentification : WWW-Authenticate: Basic realm="/MyRealm"
En réponse, le CGI reçoit le profile/mot de passe dans la variable d'environnement HTTP_AUTHORIZATION
  HTTP_AUTHORIZATION=Basic dXNlcjpwYXNzd29yZA==
 
Pour valider cette information, il faut la décoder...elle est en effet au format Base64.

Petit rappel sur les bases (cours de mathématique de primaire ! ):
  • Habituellement on travaille en base 10 : 0..9
  • En informatique on utilise couramment la base 16 : 0..9,'A'..F'
  • Sur internet on utilise la base 64 : 'A'..'Z','a'..z','+','/'
Vous trouverez dans le programme exemple une unité Base64 qui prend en charge de codage/décodage d'un type String en base 64.

le texte ci-dessus une fois décodé donne tout simplement : "user:password"

Il ne reste plus au CGI qu'a accepter le mot de passe en envoyant les informations demandées ou renvoyer l'erreur 401.
Une autre alternative sur un mot de passe invalide étant de rediriger sur la page d'acceuil par exemple.

Pour la mise en pratique, téléchargez le programme login (sans oublier de renommer l'executable et le point ini en nph-login.exe et npg-login.ini)

c'est tout ! A +