Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе показано, как написать скрипт, использующий объект WinHttpRequest для доступа к данным с сервера, требующего проверки подлинности HTTP.
- Предварительные условия и требования
- доступ к веб-сайту с помощью проверки подлинности
- Проверка кодов состояния
- связанные темы
Предпосылки и требования
Помимо рабочих знаний Microsoft JScript, в этом примере требуется следующее:
- Текущая версия пакета средств разработки программного обеспечения Microsoft Windows (SDK).
- Средство настройки прокси-сервера для установки параметров прокси-сервера для служб HTTP Microsoft Windows (WinHTTP), если подключение к Интернету осуществляется через прокси-сервер. См. Proxycfg.exe, средство настройки прокси-сервера для получения дополнительной информации.
- Знакомство с сетевой терминологией и понятиями.
Доступ к веб-сайту с проверкой подлинности
Чтобы создать скрипт, демонстрирующий аутентификацию, выполните следующее:
Откройте текстовый редактор, например Microsoft Notepad.
Скопируйте следующий код в текстовый редактор после замены "[authenticationSite]" соответствующим текстом, чтобы указать URL-адрес сайта, требующего проверки подлинности 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( );Сохраните файл как "Auth.js".
В командной строке введите "cscript Auth.js" и нажмите клавишу ВВОД.
Теперь у вас есть программа, которая запрашивает ресурс двумя разными способами. Первый метод запрашивает ресурс без предоставления учетных данных. Возвращается код состояния 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", он указывает, что прокси-сервер требует проверки подлинности. Каждый заголовок проверки подлинности содержит доступную схему проверки подлинности и иногда область. Значение области действия чувствительно к регистру и определяет набор серверов или прокси-серверов, для которых должны приниматься те же учетные данные.
Существует два заголовка с именем WWW-Authentication, которые указывают на то, что поддерживаются несколько схем проверки подлинности. Если вызвать метод GetResponseHeader для поиска заголовков WWW-Authenticate, метод возвращает только содержимое первого заголовка этого имени. В этом случае возвращается значение "NTLM". Чтобы убедиться, что все вхождения заголовка обрабатываются, используйте вместо этого метод getAllResponseHeaders .
Второй метод вызывает тот же ресурс, но сначала предоставляет учетные данные проверки подлинности путем вызова метода SetCredentials. В следующем разделе кода показано, как используется этот метод.
WinHttpReq.SetCredentials( "User Name", "Password",
HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
Этот метод задает имя пользователя "UserName", пароль на "Пароль" и указывает, что учетные данные авторизации применяются к серверу ресурсов. Учетные данные проверки подлинности также можно отправлять на прокси-сервер.
При указании учетных данных сервер возвращает код состояния 200, указывающий на то, что документ можно получить.
Проверка кодов состояния
Предыдущий пример является инструкцией, но требуется, чтобы пользователь явно предоставлял учетные данные. Приложение, которое предоставляет учетные данные, если это необходимо, и не предоставляет учетные данные, если это не требуется, более полезно. Чтобы реализовать эту функцию, необходимо изменить пример, чтобы проверить код состояния, возвращенный ответом.
Полный список возможных кодов состояния, а также описания см. в разделе коды состояния HTTP. Однако в этом примере следует столкнуться только с одним из трех кодов. Код состояния 200 указывает, что ресурс доступен и отправляется с ответом. Код состояния 401 указывает, что серверу требуется проверка подлинности. Код состояния 407 указывает, что прокси-сервер требует проверки подлинности.
Измените пример, созданный в последнем разделе, заменив функцию getText2 следующим кодом (замените "[authenticationSite]" собственным текстом, чтобы указать URL-адрес сайта, требующего проверки подлинности 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( );
};
Снова сохраните и запустите файл. Второй метод по-прежнему получает документ, но предоставляет учетные данные только при необходимости. Функция getText2 выполняет метод Open и метод Send так, как если бы проверка подлинности не требовалась. Состояние извлекается с помощью свойства Status, а инструкция switch отвечает на полученный код состояния. Если состояние равно 401 (серверу требуется проверка подлинности) или 407 (для прокси-сервера требуется проверка подлинности), метод Open выполняется снова. За этим следует метод SetCredentials, задающий имя пользователя и пароль. Затем код циклит обратно в метод отправки. Если после трех попыток ресурс не может быть успешно извлечен, функция останавливает выполнение.
Связанные разделы
-
проверка подлинности в WinHTTP