スクリプトを使用した認証
このセクションでは、 WinHttpRequest オブジェクトを使用して HTTP 認証を必要とするサーバーからデータにアクセスするスクリプトを記述する方法について説明します。
前提条件と要件
この例では、Microsoft JScript に関する実用的な知識に加えて、次のものが必要です。
- Microsoft Windows ソフトウェア開発キット (SDK) の現在のバージョン。
- インターネットへの接続がプロキシ サーバー経由の場合に、Microsoft Windows HTTP Services (WinHTTP) のプロキシ設定を確立するためのプロキシ構成ツール。 詳細については、「 Proxycfg.exeプロキシ構成ツール 」を参照してください。
- ネットワークの用語と概念に関する知識。
認証を使用した Web サイトへのアクセス
認証を示すスクリプトを作成するには、次の操作を行います。
Microsoft メモ帳などのテキスト エディターを開きます。
"[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( );
ファイルを "Auth.js" として保存します。
コマンド プロンプトで、「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 回試行した後にリソースを正常に取得できない場合、関数は実行を停止します。
関連トピック