スクリプトを使用した認証

このセクションでは、 WinHttpRequest オブジェクトを使用して HTTP 認証を必要とするサーバーからデータにアクセスするスクリプトを記述する方法について説明します。

前提条件と要件

この例では、Microsoft JScript に関する実用的な知識に加えて、次のものが必要です。

  • Microsoft Windows ソフトウェア開発キット (SDK) の現在のバージョン。
  • インターネットへの接続がプロキシ サーバー経由の場合に、Microsoft Windows HTTP Services (WinHTTP) のプロキシ設定を確立するためのプロキシ構成ツール。 詳細については、「 Proxycfg.exeプロキシ構成ツール 」を参照してください。
  • ネットワークの用語と概念に関する知識。

認証を使用した Web サイトへのアクセス

認証を示すスクリプトを作成するには、次の操作を行います。

  1. Microsoft メモ帳などのテキスト エディターを開きます。

  2. "[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( );
    
  3. ファイルを "Auth.js" として保存します。

  4. コマンド プロンプトで、「cscript Auth.js」と入力し、Enter キーを押します。

これで、2 つの異なる方法でリソースを要求するプログラムが作成されました。 最初のメソッドは、資格情報を指定せずにリソースを要求します。 サーバーに認証が必要であることを示す 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-Authenticate" という名前のヘッダーは、サーバーがこのリソースの認証を必要とすることを示します。 "Proxy-Authenticate" という名前のヘッダーがある場合は、プロキシ サーバーに認証が必要であることを示します。 各認証ヘッダーには、使用可能な認証スキームと場合によっては領域が含まれています。 領域の値では大文字と小文字が区別され、同じ資格情報を受け入れるサーバーまたはプロキシのセットを定義します。

"WWW-Authenticate" という名前の 2 つのヘッダーがあります。これは、複数の認証スキームがサポートされていることを示します。 GetResponseHeader メソッドを呼び出して "WWW-Authenticate" ヘッダーを検索すると、メソッドはその名前の最初のヘッダーの内容のみを返します。 この場合、"NTLM" の値が返されます。 ヘッダーのすべての出現箇所が確実に処理されるようにするには、代わりに GetAllResponseHeaders メソッドを使用します。

2 番目のメソッド呼び出しは同じリソースを要求しますが、最初に SetCredentials メソッドを呼び出して認証資格情報を提供します。 コードの次のセクションでは、このメソッドの使用方法を示します。

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

このメソッドは、ユーザー名を "UserName" に設定し、パスワードを "Password" に設定し、承認資格情報がリソース サーバーに適用されることを示します。 認証資格情報はプロキシに送信することもできます。

資格情報が指定されると、サーバーはドキュメントを取得できることを示す 200 状態コードを返します。

状態コードの確認

前の例は説明ですが、ユーザーが明示的に資格情報を指定する必要があります。 必要なときに資格情報を提供し、不要な場合は資格情報を提供しないアプリケーションの方が便利です。 これを行う機能を実装するには、応答で返される状態コードを調べるために例を変更する必要があります。

使用可能な状態コードの完全な一覧と説明については、「 HTTP 状態コード」を参照してください。 ただし、この例では、3 つのコードのうち 1 つだけが発生します。 状態コード 200 は、リソースが使用可能であり、応答と共に送信されていることを示します。 状態コード 401 は、サーバーに認証が必要であることを示します。 状態コード 407 は、プロキシに認証が必要であることを示します。

"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( );
};

ここでも、ファイルを保存して実行します。 2 番目のメソッドは引き続きドキュメントを取得しますが、必要な場合にのみ資格情報を提供します。 "getText2" 関数は、認証が必要ないかのように Open メソッドと Send メソッドを実行します。 状態は Status プロパティを使用して取得され、switch ステートメントは結果の状態コードに応答します。 状態が 401 (サーバーで認証が必要) または 407 (プロキシで認証が必要) の場合は、 Open メソッドが再度実行されます。 その後に SetCredentials メソッドが 続き、ユーザー名とパスワードが設定されます。 その後、コードは Send メソッドに戻ります。 3 回試行した後にリソースを正常に取得できない場合、関数は実行を停止します。

WinHTTP での認証

WinHttpRequest

SetCredentials

HTTP/1.1 コメントの要求 (RFC 2616)