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 に進みます。
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 認証
- コンテンツ タイプ
- コンテンツの長さ
- 日にち
- サーバ
何か提案はありますか?