共用方式為


使用腳本進行驗證

本節示範如何撰寫使用 WinHttpRequest 物件的腳本,從需要 HTTP 驗證的伺服器存取資料。

必要條件和需求

除了 Microsoft JScript 的工作知識之外,此範例還需要下列各項:

  • Microsoft Windows 軟體發展工具組的目前版本 (SDK) 。
  • 如果您的網際網路連線是透過 Proxy 伺服器,Proxy 組態工具可建立 Microsoft Windows HTTP Services (WinHTTP) 的 Proxy 設定。 如需詳細資訊 ,請參閱Proxycfg.exe Proxy 組態工具
  • 熟悉 網路術語 和概念。

使用驗證存取網站

若要建立示範驗證的腳本,請執行下列動作:

  1. 開啟文字編輯器,例如 Microsoft 記事本。

  2. 將下列程式碼複製到文字編輯器中,將 「[authenticationSite]」 取代為適當的文字,以指定需要 HTTP 驗證的網站 URL。

    // 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. 將檔案儲存為 「Auth.js」。

  4. 在命令提示字元中,輸入 「cscript Auth.js」,然後按 ENTER 鍵。

您現在有一個要求資源兩種不同方式的程式。 第一個方法會要求資源,而不需提供認證。 傳回 401 狀態碼,表示伺服器需要驗證。 回應標頭也會顯示,看起來應該類似下列內容:

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

雖然回應指出資源存取遭到拒絕,但仍會傳回數個標頭,以提供資源的一些資訊。 名為 「WWW-Authentication」 的標頭表示伺服器需要此資源的驗證。 如果有名為 「Proxy-Authentication」 的標頭,表示 Proxy 伺服器需要驗證。 每個驗證標頭都包含可用的驗證配置,有時則是領域。 領域值會區分大小寫,並定義應該接受相同認證的一組伺服器或 Proxy。

有兩個名為 「WWW-Authentication」 的標頭,表示支援多個驗證配置。 如果您呼叫 GetResponseHeader 方法來尋找 「WWW-Authenticate」 標頭,此方法只會傳回該名稱的第一個標頭的內容。 在此情況下,它會傳回 「NTLM」 的值。 若要確保已處理所有出現的標頭,請改用 GetAllResponseHeaders 方法。

第二個方法呼叫會要求相同的資源,但先呼叫 SetCredentials 方法來提供驗證認證。 下列程式碼區段示範如何使用這個方法。

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

此方法會將使用者名稱設定為 「UserName」、密碼設定為 「Password」,並指出授權認證適用于資源伺服器。 驗證認證也可以傳送至 Proxy。

提供認證時,伺服器會傳回 200 狀態碼,指出可以擷取檔。

檢查狀態碼

上一個範例是指示性的,但需要使用者明確提供認證。 當需要時提供認證的應用程式,且不需要時不會提供認證會比較有用。 若要實作這項功能,您必須修改範例,以檢查回應傳回的狀態碼。

如需可能狀態碼的完整清單以及描述,請參閱 HTTP 狀態碼。 不過,在此範例中,您應該只會遇到三個程式碼的其中一個。 狀態碼 200 表示資源可供使用,且正在與回應一起傳送。 狀態碼 401 表示伺服器需要驗證。 狀態碼 407 表示 Proxy 需要驗證。

將 「getText2」 函式取代為下列程式碼來修改您在最後一節中建立的範例, (以您自己的文字取代 「[authenticationSite]」,以指定需要 HTTP 驗證的網站 URL) :

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( );
};

同樣地,儲存並執行檔案。 第二種方法仍會擷取檔,但只會在必要時提供認證。 「getText2」 函式會執行 OpenSend 方法,就像不需要驗證一樣。 狀態是使用 Status 屬性擷取,switch 語句會回應產生的狀態碼。 如果狀態為 401 (伺服器需要驗證) 或 407 (Proxy 需要驗證) ,則會再次執行 Open 方法。 後面接著 SetCredentials 方法,這個方法會設定使用者名稱和密碼。 程式碼接著會迴圈回 Send 方法。 如果嘗試三次之後,就無法成功擷取資源,則函式會停止執行。

WinHTTP 中的驗證

WinHttpRequest

SetCredentials

HTTP/1.1 批註要求 (RFC 2616)