Autentisering med skript
Det här avsnittet visar hur du skriver skript som använder WinHttpRequest--objektet för att komma åt data från en server som kräver HTTP-autentisering.
- Förutsättningar och Krav
- åtkomst till en webbplats med autentisering
- Kontrollera Statuskoderna
- Relaterade ämnen
Förutsättningar och krav
Förutom en fungerande kunskap om Microsoft JScript kräver det här exemplet följande:
- Den aktuella versionen av Microsoft Windows Software Development Kit (SDK).
- Proxykonfigurationsverktyget för att upprätta proxyinställningarna för Microsoft Windows HTTP Services (WinHTTP), om anslutningen till Internet sker via en proxyserver. Mer information finns i Proxycfg.exe, ett proxykonfigurationsverktyg.
- Kunskaper om nätverksterminologi och begrepp.
Åtkomst till en webbplats med autentisering
Om du vill skapa ett skript som demonstrerar autentisering gör du följande:
Öppna en textredigerare, till exempel Microsoft Anteckningar.
Kopiera följande kod till textredigeraren när du har ersatt "[authenticationSite]" med lämplig text för att ange URL:en för en webbplats som kräver HTTP-autentisering.
// 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( );
Spara filen som "Auth.js".
Från en kommandotolk skriver du "cscript Auth.js" och trycker på RETUR-tangenten.
Nu har du ett program som begär en resurs på två olika sätt. Den första metoden begär resursen utan att ange autentiseringsuppgifter. En 401-statuskod returneras för att indikera att servern kräver autentisering. Svarshuvudena visas också och bör se ut ungefär så här:
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
Även om svaret anger att åtkomsten till resursen nekades, returnerar den fortfarande flera rubriker som ger viss information om resursen. Rubriken "WWW-Authenticate" anger att servern kräver autentisering för den här resursen. Om det fanns ett huvud med namnet "Proxy-Authenticate" skulle det indikera att proxyservern kräver autentisering. Varje autentiseringshuvud innehåller ett tillgängligt autentiseringsschema och ibland en sfär. Sfärvärdet är skiftlägeskänsligt och definierar en uppsättning servrar eller proxyservrar som samma autentiseringsuppgifter ska godkännas för.
Det finns två rubriker med namnet "WWW-Authenticate", som anger att flera autentiseringsscheman stöds. Om du anropar metoden GetResponseHeader för att hitta "WWW-Authenticate"-huvuden, returnerar metoden endast innehållet i det första huvudet i det namnet. I det här fallet returneras värdet "NTLM". För att säkerställa att alla förekomster av ett huvud bearbetas använder du metoden GetAllResponseHeaders i stället.
Det andra metodanropet begär samma resurs, men tillhandahåller först autentiseringsuppgifter genom att anropa metoden SetCredentials. Följande kodavsnitt visar hur den här metoden används.
WinHttpReq.SetCredentials( "User Name", "Password",
HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
Den här metoden anger användarnamnet till "Användarnamn", lösenordet till "Lösenord" och anger att autentiseringsuppgifterna för auktorisering gäller för resursservern. Autentiseringsuppgifter kan också skickas till en proxyserver.
När autentiseringsuppgifterna anges returnerar servern en statuskod på 200 som anger att dokumentet kan hämtas.
Kontrollera statuskoderna
Föregående exempel är instruktion, men det kräver att användaren uttryckligen anger autentiseringsuppgifter. Ett program som tillhandahåller autentiseringsuppgifter när det är nödvändigt och inte anger autentiseringsuppgifter när det inte är nödvändigt är mer användbart. Om du vill implementera en funktion som gör detta måste du ändra ditt exempel för att undersöka statuskoden som returneras med svaret.
En fullständig lista över möjliga statuskoder, tillsammans med beskrivningar, finns i HTTP-statuskoder. I det här exemplet bör du dock bara stöta på en av tre koder. En statuskod på 200 anger att en resurs är tillgänglig och skickas med svaret. En statuskod på 401 anger att servern kräver autentisering. En statuskod på 407 anger att proxyn kräver autentisering.
Ändra exemplet som du skapade i det sista avsnittet genom att ersätta funktionen "getText2" med följande kod (ersätt "[authenticationSite]" med din egen text för att ange URL:en för en webbplats som kräver HTTP-autentisering):
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( );
};
Spara och kör filen igen. Den andra metoden hämtar fortfarande dokumentet, men det ger bara autentiseringsuppgifter när det behövs. Funktionen "getText2" kör Open och Send-metoder som om autentisering inte krävdes. Statusen hämtas med egenskapen Status och en switch-instruktion svarar på den resulterande statuskoden. Om statusen är 401 (servern kräver autentisering) eller 407 (proxy kräver autentisering) körs metoden Öppna igen. Detta följs av metoden SetCredentials som anger användarnamn och lösenord. Koden loopas sedan tillbaka till metoden Send. Om resursen inte kan hämtas efter tre försök stannar funktionen.
Relaterade ämnen