使用腳本進行驗證
本節示範如何撰寫使用 WinHttpRequest 物件的腳本,從需要 HTTP 驗證的伺服器存取資料。
必要條件和需求
除了 Microsoft JScript 的工作知識之外,此範例還需要下列各項:
- Microsoft Windows 軟體發展工具組的目前版本 (SDK) 。
- 如果您的網際網路連線是透過 Proxy 伺服器,Proxy 組態工具可建立 Microsoft Windows HTTP Services (WinHTTP) 的 Proxy 設定。 如需詳細資訊 ,請參閱Proxycfg.exe Proxy 組態工具 。
- 熟悉 網路術語 和概念。
使用驗證存取網站
若要建立示範驗證的腳本,請執行下列動作:
開啟文字編輯器,例如 Microsoft 記事本。
將下列程式碼複製到文字編輯器中,將 「[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( );
將檔案儲存為 「Auth.js」。
在命令提示字元中,輸入 「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」 函式會執行 Open 和 Send 方法,就像不需要驗證一樣。 狀態是使用 Status 屬性擷取,switch 語句會回應產生的狀態碼。 如果狀態為 401 (伺服器需要驗證) 或 407 (Proxy 需要驗證) ,則會再次執行 Open 方法。 後面接著 SetCredentials 方法,這個方法會設定使用者名稱和密碼。 程式碼接著會迴圈回 Send 方法。 如果嘗試三次之後,就無法成功擷取資源,則函式會停止執行。
相關主題