Compartilhar via


Autenticação usando script

Esta seção demonstra como escrever um script que usa o objeto WinHttpRequest para acessar dados de um servidor que requer autenticação HTTP.

Pré-requisitos e requisitos

Além de um conhecimento prático do Microsoft JScript, este exemplo requer o seguinte:

  • A versão atual do Microsoft Windows Software Development Kit (SDK).
  • A ferramenta de configuração de proxy para estabelecer as configurações de proxy para Os Serviços HTTP do Microsoft Windows (WinHTTP), se sua conexão com a Internet for por meio de um servidor proxy. Consulte Proxycfg.exe, uma Ferramenta de Configuração de Proxy para obter mais informações.
  • Uma familiaridade com a terminologia e os conceitos de rede.

Acessando um site com autenticação

Para criar um script que demonstre autenticação, faça o seguinte:

  1. Abra um editor de texto, como o Bloco de Notas da Microsoft.

  2. Copie o código a seguir no editor de texto depois de substituir "[authenticationSite]" pelo texto apropriado para especificar a URL de um site que requer autenticação 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. Salve o arquivo como "Auth.js".

  4. Em um prompt de comando, digite "cscript Auth.js" e pressione ENTER.

Agora você tem um programa que solicita um recurso de duas maneiras diferentes. O primeiro método solicita o recurso sem fornecer credenciais. Um código de status 401 é retornado para indicar que o servidor requer autenticação. Os cabeçalhos de resposta também são exibidos e devem ser semelhantes aos seguintes:

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

Embora a resposta indique que o acesso ao recurso foi negado, ele ainda retorna vários cabeçalhos que fornecem algumas informações sobre o recurso. O cabeçalho chamado "WWW-Authenticate" indica que o servidor requer autenticação para esse recurso. Se houvesse um cabeçalho chamado "Proxy-Authenticate", isso indicaria que o servidor proxy requer autenticação. Cada cabeçalho de autenticação contém um esquema de autenticação disponível e, às vezes, um realm. O valor realm diferencia maiúsculas de minúsculas e define um conjunto de servidores ou proxies para os quais as mesmas credenciais devem ser aceitas.

Há dois cabeçalhos chamados "WWW-Authenticate", que indicam que há suporte para vários esquemas de autenticação. Se você chamar o método GetResponseHeader para localizar cabeçalhos "WWW-Authenticate", o método retornará apenas o conteúdo do primeiro cabeçalho desse nome. Nesse caso, ele retorna um valor de "NTLM". Para garantir que todas as ocorrências de um cabeçalho sejam processadas, use o método GetAllResponseHeaders .

A segunda chamada de método solicita o mesmo recurso, mas primeiro fornece credenciais de autenticação chamando o método SetCredentials . A seção de código a seguir mostra como esse método é usado.

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

Esse método define o nome de usuário como "UserName", a senha como "Password" e indica que as credenciais de autorização se aplicam ao servidor de recursos. As credenciais de autenticação também podem ser enviadas para um proxy.

Quando as credenciais são fornecidas, o servidor retorna 200 status código que indica que o documento pode ser recuperado.

Verificando os códigos de status

O exemplo anterior é instrucional, mas requer que o usuário forneça explicitamente as credenciais. Um aplicativo que fornece credenciais quando é necessário e não fornece credenciais quando não é necessário é mais útil. Para implementar um recurso que faça isso, você deve modificar seu exemplo para examinar o código status retornado com a resposta.

Para obter uma lista completa de possíveis códigos de status, juntamente com descrições, consulte Códigos de status HTTP. Para este exemplo, no entanto, você deve encontrar apenas um dos três códigos. Um código de status de 200 indica que um recurso está disponível e está sendo enviado com a resposta. Um código de status 401 indica que o servidor requer autenticação. Um código de status 407 indica que o proxy requer autenticação.

Modifique o exemplo que você criou na última seção substituindo a função "getText2" pelo código a seguir (substitua "[authenticationSite]" pelo seu próprio texto para especificar a URL de um site que requer autenticação 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( );
};

Novamente, salve e execute o arquivo. O segundo método ainda recupera o documento, mas só fornece credenciais quando necessário. A função "getText2" executa os métodos Open e Send como se a autenticação não fosse necessária. O status é recuperado com a propriedade Status e uma instrução switch responde ao código de status resultante. Se o status for 401 (o servidor requer autenticação) ou 407 (o proxy requer autenticação), o método Open será executado novamente. Isso é seguido pelo método SetCredentials , que define o nome de usuário e a senha. Em seguida, o código executa um loop de volta para o método Send . Se, após três tentativas, o recurso não puder ser recuperado com êxito, a função interromperá a execução.

Autenticação no WinHTTP

WinHttpRequest

SetCredentials

Solicitação HTTP/1.1 para Comentários (RFC 2616)