Проверка подлинности с помощью скрипта

В этом разделе показано, как создать скрипт, использующий объект WinHttpRequest для доступа к данным с сервера, требующего проверки подлинности HTTP.

Предварительные требования и требования

Помимо рабочих знаний о Microsoft JScript, в этом примере требуется следующее:

Доступ к веб-сайту с проверкой подлинности

Чтобы создать скрипт, демонстрирующий проверку подлинности, выполните следующие действия.

  1. Откройте текстовый редактор, например Microsoft Notepad.

  2. Скопируйте следующий код в текстовый редактор после замены "[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( );
    
  3. Сохраните файл как "Auth.js".

  4. В командной строке введите "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 , который задает имя пользователя и пароль. Затем код циклически возвращается к методу Send . Если после трех попыток ресурс не может быть успешно получен, функция останавливает выполнение.

Проверка подлинности в WinHTTP

WinHttpRequest

SetCredentials

Http/1.1 Request for Comments (RFC 2616)