Sdílet prostřednictvím


Ověřování pomocí skriptu

Tato část ukazuje, jak napsat skript, který používá WinHttpRequest objekt pro přístup k datům ze serveru, který vyžaduje ověřování HTTP.

Předpoklady a požadavky

Kromě znalostí jazyka Microsoft JScript vyžaduje tento příklad následující:

  • Aktuální verze sady Microsoft Windows Software Development Kit (SDK).
  • Konfigurační nástroj proxy serveru pro vytvoření nastavení proxy serveru pro službu Microsoft Windows HTTP Services (WinHTTP), pokud je připojení k internetu přes proxy server. Další informace najdete v tématu Proxycfg.exe, nástroj pro konfiguraci proxy serveru.
  • Znalost terminologie sítě a konceptů.

Přístup k webu s ověřováním

K vytvoření skriptu, který demonstruje ověřování, postupujte takto:

  1. Otevřete textový editor, například Poznámkový blok Microsoftu.

  2. Po nahrazení [authenticationSite] odpovídajícím textem zadejte adresu URL webu, který vyžaduje ověření HTTP, zkopírujte následující kód do textového editoru.

    // 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. Uložte soubor jakoAuth.js.

  4. Na příkazovém řádku zadejte "cscript Auth.js" a stiskněte ENTER.

Teď máte program, který vyžaduje prostředek dvěma různými způsoby. První metoda požaduje prostředek bez zadání autentizačních údajů. Vrátí se stavový kód 401, který indikuje, že server vyžaduje ověření. Zobrazí se také hlavičky odpovědi, které by měly vypadat nějak takto:

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

I když odpověď značí, že přístup k prostředku byl odepřen, stále vrací několik hlaviček, které poskytují určité informace o prostředku. Hlavička s názvem WWW-Authenticate označuje, že server vyžaduje ověření pro tento prostředek. Pokud se zobrazila hlavička s názvem Proxy-Authenticate, znamená to, že proxy server vyžaduje ověření. Každá hlavička ověřování obsahuje dostupné schéma ověřování a někdy sféru. Hodnota sféry, která rozlišuje mezi malými a velkými písmeny, definuje sadu serverů nebo proxy serverů, pro které mají být přijaty stejné přihlašovací údaje.

Existují dvě hlavičky s názvem WWW-Authenticate, které označují, že se podporuje více schémat ověřování. Pokud zavoláte metodu GetResponseHeader, aby našla hlavičky "WWW-Authenticate", metoda vrátí pouze obsah první hlavičky tohoto názvu. V tomto případě vrátí hodnotu "NTLM". K zajištění zpracování všech výskytů hlavičky použijte metodu GetAllResponseHeaders.

Druhé volání metody vyžaduje stejný prostředek, ale nejprve poskytuje přihlašovací údaje pro ověřování voláním metody SetCredentials. Následující část kódu ukazuje, jak se tato metoda používá.

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

Tato metoda nastaví uživatelské jméno na "UserName", heslo na "Password" a označuje, že autorizační údaje platí k serveru zdrojů. Přihlašovací údaje pro ověřování je možné odeslat také na proxy server.

Po zadání přihlašovacích údajů vrátí server stavový kód 200, který indikuje, že dokument lze načíst.

Kontrola stavových kódů

Předchozí příklad je instrukční, ale vyžaduje, aby uživatel explicitně zadá přihlašovací údaje. Aplikace, která zadává přihlašovací údaje v případě potřeby a nezadává přihlašovací údaje, pokud není potřeba, je užitečnější. Pokud chcete implementovat funkci, která to dělá, je nutné upravit příklad tak, aby prozkoumal stavový kód vrácený odpovědí.

Úplný seznam možných stavových kódů spolu s popisy najdete v tématu stavové kódy HTTP. V tomto příkladu byste ale měli narazit pouze na jeden ze tří kódů. Stavový kód 200 označuje, že je prostředek dostupný a odesílá se s odpovědí. Stavový kód 401 označuje, že server vyžaduje ověření. Stavový kód 407 označuje, že proxy server vyžaduje ověření.

Upravte příklad, který jste vytvořili v poslední části, nahrazením funkce "getText2" následujícím kódem (nahraďte "[authenticationSite]" vlastním textem, aby bylo možné určit adresu URL webu, který vyžaduje ověřování 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( );
};

Znovu soubor uložte a spusťte. Druhá metoda stále načte dokument, ale v případě potřeby poskytuje pouze přihlašovací údaje. Funkce getText2 spustí metody Open a Send metody, jako by se nepožadovalo ověřování. Stav se načte pomocí vlastnosti Status a příkaz switch reaguje na výsledný stavový kód. Pokud je stav 401 (server vyžaduje ověření) nebo 407 (proxy vyžaduje ověření), spustí se znovu metoda Open. Následuje metoda SetCredentials, která nastaví uživatelské jméno a heslo. Kód se pak vrátí zpět do metody Send. Pokud po třech pokusech nelze prostředek úspěšně načíst, funkce ukončí provádění.

Ověřování ve službě WinHTTP

WinHttpRequest

SetCredentials

HTTP/1.1 Request for Comments (RFC 2616)