2

Web サーバーに対して認証するためのカスタム ログイン フォームが必要です。サーバーは非常にシンプル (組み込みプラットフォームに基づく) であるため、複雑なメカニズム (php、asp、ssl など) は使用できません。私のニーズには、基本的な HTTP 認証が適しています。さらに、ログアウト機能が必要です。

login.html、/pages/protected.html、auth.js を実装しました。1 つ目は、ログイン フォームを含むインデックス ページです。送信ボタンは、auth.js の login() 関数を呼び出します。2 番目は保護されたページ (/pages フォルダーの下のすべてのファイルが保護されています) で、正しいログインに対してのみ表示されます。このページには、auth.js の logout() 関数を呼び出すログアウト ボタンがあります。

これは auth.js の内容です:

var loginURL = "/login.html";
var logoutURL = "/pages/logout.html";
var userAgent = navigator.userAgent.toLowerCase();

function getHTTPObject() {
  var xmlhttp = false;

  if (window.XMLHttpRequest) {  // code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp = new XMLHttpRequest();
  } else {                      // code for IE6, IE5
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  return xmlhttp;
}

function login(strUrl) {
  var user = document.getElementById("txt_username").value;
  var pass = document.getElementById("txt_password").value;
  var http = getHTTPObject();
  http.open("get", strUrl, false, user, pass);
  http.send("");
  if (http.status == 200) {
    document.location = strUrl;
  } else {
    alert("Incorrect username and/or password!");
  }
  return false;
}

function logout() {
  if (userAgent.indexOf("msie") != -1) {
    document.execCommand("ClearAuthenticationCache", false);
  }
  var http = getHTTPObject();
  var logout_url = "/login.html";
  http.open("get", logout_url, false);
  http.send("");
  document.location = logout_url;
  return false;
}

サーバーは、リクエストに Authorization ヘッダーがない場合、401 および WWW-Authenticate HTTP ヘッダーで応答するようにプログラムされています。リクエストに不正な認証情報を持つ Authorization ヘッダーが含まれている場合、403 で応答します。このようにして、ブラウザのログイン ウィンドウで不正な資格情報が表示されるのを回避できます。

Firefox の最新バージョンでは、これは非常にうまく機能し、IE でも機能します。しかし、IE は、フォームに入力された資格情報が修正されていても、ユーザー/パスワードのテキスト ボックスを含む小さなダイアログ ウィンドウをポップアップすることを要求することがあります。

次のループを開始します。

  1. 正しいユーザー名とパスワードを入力してください
  2. ログインをクリックすると、保護されたページが表示されます
  3. ログアウトをクリック
  4. ステップ 1 に進みます。

n 回 (n は 1、5、または 10) 後、ログイン ボタンをクリックした後、IE から認証フォームを受け取ります。

ご存じのように、IE で資格情報キャッシュをクリアした後 (ClearAuthenticationCache を使用)、まずブラウザーは資格情報なしで要求を送信します (XMLHttpRequest オブジェクトにユーザー名とパスワードのパラメーターがある場合でも)。Web サーバーが 401 コードと WWW-Authenticate ヘッダーで応答した場合にのみ、ブラウザーは資格情報を含む要求を再度送信します。

普通のPCにlighttpdサーバーで同じページを実装してみました。この場合、IE にはポップアップの問題はないようです。そのため、IE は組み込みサーバー (つまり HTTP1.0) の応答をあまり好みません。サーバーは次の HTTP ヘッダーで応答します。

  • HTTP 1.0 (正しいクレデンシャルの場合は 200、クレデンシャルがない場合は 401、不正なクレデンシャルの場合は 403 )
  • サーバ
  • WWW-Authenticate (クレデンシャルがない場合)
  • 接続: 閉じる
  • コンテンツ タイプ

lighttpd (HTTP 1.1) からの回答には、さらに多くのヘッダーがあります。

  • HTTP 1.1 とコード
  • WWW 認証
  • コンテンツ タイプ
  • コンテンツの長さ
  • 日にち
  • サーバ

何か提案はありますか?

4

0 に答える 0