Authentification à l’aide d’un script

Cette section montre comment écrire un script qui utilise l’objet WinHttpRequest pour accéder aux données à partir d’un serveur qui nécessite l’authentification HTTP.

Conditions préalables et conditions requises

Outre une connaissance pratique de Microsoft JScript, cet exemple nécessite les éléments suivants :

Accès à un site web avec authentification

Pour créer un script qui illustre l’authentification, procédez comme suit :

  1. Ouvrez un éditeur de texte tel que le Bloc-notes Microsoft.

  2. Copiez le code suivant dans l’éditeur de texte après avoir remplacé « [authenticationSite] » par le texte approprié pour spécifier l’URL d’un site qui nécessite l’authentification HTTP.

    // Load the WinHttpRequest object.
    var WinHttpReq = 
              new ActiveXObject("WinHttp.WinHttpRequest.5.1");
    
    function getText1( )
    {
      // Specify the target resource.
      WinHttpReq.open( "GET", 
                       "https://[authenticationSite]", 
                       false;
    
      // Send a request to the server and wait for a response.
      WinHttpReq.send( );
    
      // Display the results of the request.
      WScript.Echo( "No Credentials: " );
      WScript.Echo( WinHttpReq.Status + "   " + WinHttpReq.StatusText);
      WScript.Echo( WinHttpReq.GetAllResponseHeaders);
      WScript.Echo( );
    };
    
    function getText2( )
    {
      // HttpRequest SetCredentials flags
      HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0;
    
      // Specify the target resource.
      WinHttpReq.open( "GET", 
                       "https://[authenticationSite]", 
                       false );
    
      // Set credentials for server.
      WinHttpReq.SetCredentials( "User Name", 
                                 "Password",
                                 HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
    
      // It might also be necessary to supply credentials 
      // to the proxy if you connect to the Internet 
      // through a proxy that requires authentication.
    
      // Send a request to the server and wait for 
      // a response.
      WinHttpReq.send( );
    
      // Display the results of the request.
      WScript.Echo( "Credentials: " );
      WScript.Echo( WinHttpReq.Status + "   " + WinHttpReq.StatusText );
      WScript.Echo( WinHttpReq.GetAllResponseHeaders( ) );
      WScript.Echo( );
    };
    
    getText1( );
    getText2( );
    
  3. Enregistrez le fichier en tant que « Auth.js ».

  4. À partir d’une invite de commandes, tapez « cscript Auth.js », puis appuyez sur ENTRÉE.

Vous disposez maintenant d’un programme qui demande une ressource de deux façons différentes. La première méthode demande la ressource sans fournir d’informations d’identification. Un code de status 401 est retourné pour indiquer que le serveur a besoin d’une authentification. Les en-têtes de réponse sont également affichés et doivent ressembler à ce qui suit :

Connection: Keep-Alive
Content-Length: 0
Date: Fri, 27 Apr 2001 01:47:18 GMT
Content-Type: text/html
Server: Microsoft-IIS/5.0
WWW-Authenticate: NTLM
WWW-Authenticate: Negotiate
Cache-control: private

Bien que la réponse indique que l’accès à la ressource a été refusé, elle retourne toujours plusieurs en-têtes qui fournissent des informations sur la ressource. L’en-tête nommé « WWW-Authenticate » indique que le serveur a besoin d’une authentification pour cette ressource. S’il existait un en-tête nommé « Proxy-Authenticate », cela indiquerait que le serveur proxy nécessite une authentification. Chaque en-tête d’authentification contient un schéma d’authentification disponible et parfois un domaine. La valeur du domaine respecte la casse et définit un ensemble de serveurs ou de proxys pour lesquels les mêmes informations d’identification doivent être acceptées.

Il existe deux en-têtes nommés « WWW-Authenticate », qui indiquent que plusieurs schémas d’authentification sont pris en charge. Si vous appelez la méthode GetResponseHeader pour rechercher les en-têtes « WWW-Authenticate », la méthode retourne uniquement le contenu du premier en-tête de ce nom. Dans ce cas, il retourne la valeur « NTLM ». Pour vous assurer que toutes les occurrences d’un en-tête sont traitées, utilisez plutôt la méthode GetAllResponseHeaders .

Le deuxième appel de méthode demande la même ressource, mais fournit d’abord les informations d’identification d’authentification en appelant la méthode SetCredentials . La section de code suivante montre comment cette méthode est utilisée.

WinHttpReq.SetCredentials( "User Name", "Password",
                               HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);

Cette méthode définit le nom d’utilisateur sur « UserName », le mot de passe sur « Password » et indique que les informations d’identification d’autorisation s’appliquent au serveur de ressources. Les informations d’identification d’authentification peuvent également être envoyées à un proxy.

Lorsque des informations d’identification sont fournies, le serveur retourne un code 200 status qui indique que le document peut être récupéré.

Vérification des codes d’état

L’exemple précédent est instructionnel, mais il nécessite que l’utilisateur fournisse explicitement des informations d’identification. Une application qui fournit des informations d’identification quand cela est nécessaire et qui ne fournit pas d’informations d’identification lorsque ce n’est pas nécessaire est plus utile. Pour implémenter une fonctionnalité qui effectue cette opération, vous devez modifier votre exemple afin d’examiner le code status retourné avec la réponse.

Pour obtenir la liste complète des codes de status possibles, ainsi que des descriptions, consultez Codes d’état HTTP. Pour cet exemple, toutefois, vous ne devez rencontrer qu’un seul des trois codes. Un code status de 200 indique qu’une ressource est disponible et qu’elle est envoyée avec la réponse. Un code status 401 indique que le serveur a besoin d’une authentification. Un code status 407 indique que le proxy nécessite une authentification.

Modifiez l’exemple que vous avez créé dans la dernière section en remplaçant la fonction « getText2 » par le code suivant (remplacez « [authenticationSite] » par votre propre texte pour spécifier l’URL d’un site qui nécessite l’authentification HTTP) :

function getText2() {
  WScript.Echo( "Credentials: " );

  // HttpRequest SetCredentials flags.
  HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0;
  HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = 1;

  // Specify the target resource.
  var targURL = "https://[authenticationSite]";
  WinHttpReq.open( "GET", targURL, false );

  var Done = false;
  var Attempts = 0;
  do
  {
    // Keep track of the number of request attempts.
    Attempts++;

    // Send a request to the server and wait for a response.
    WinHttpReq.send( );

    // Obtain the status code from the response.
    var Status = WinHttpReq.Status;

    switch (Status)
    {
      // A 200 status indicates that the resource was retrieved.
      case 200:
        Done = true;
        break;

      // A 401 status indicates that the server 
      // requires authentication.
      case 401:
        WScript.Echo( "Requires Server UserName and Password." );

        // Specify the target resource.
        WinHttpReq.open( "GET", targURL, false );

        // Set credentials for the server.
        WinHttpReq.SetCredentials( "User Name", 
                             "Password",
                              HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
        break;

      // A 407 status indicates that the proxy 
      // requires authentication.
      case 407:
        WScript.Echo( "Requires Proxy UserName and Password." );

        // Specify the target resource.
        WinHttpReq.open( "GET", targURL, false );

        // Set credentials for the proxy.
        WinHttpReq.SetCredentials( "User Name", 
                              "Password",
                              HTTPREQUEST_SETCREDENTIALS_FOR_PROXY );
        break;
    }
  } while( ( !Done ) && ( Attempts < 3 ) );

  // Display the results of the request.
  WScript.Echo( WinHttpReq.Status + "   " + WinHttpReq.StatusText );
  WScript.Echo( WinHttpReq.GetAllResponseHeaders( ) );
  WScript.Echo( );
};

Là encore, enregistrez et exécutez le fichier. La deuxième méthode récupère toujours le document, mais elle ne fournit des informations d’identification qu’en cas de besoin. La fonction « getText2 » exécute les méthodes Open et Send comme si l’authentification n’était pas requise. Le status est récupéré avec la propriété Status et une instruction switch répond au code status résultant. Si le status est 401 (serveur nécessite une authentification) ou 407 (proxy nécessite une authentification), la méthode Open est réexécutée. Cette opération est suivie de la méthode SetCredentials , qui définit le nom d’utilisateur et le mot de passe. Le code recourt ensuite à la méthode Send . Si, après trois tentatives, la ressource ne peut pas être récupérée avec succès, la fonction arrête l’exécution.

Authentification dans WinHTTP

WinHttpRequest

SetCredentials

HTTP/1.1 Demande de commentaires (RFC 2616)