BASIC認証のユーザー名パスワードをHTMLのフォームで処理できるか試してみた

PHPとHTMLでBASIC認証のログイン処理を作って見てから気がついたんですが、InternetExplorer7では

http://ユーザー名:パスワード@localhost/

みたいなURLが無効になっているので、PHPやHTMLを用いた方法では出来ない事はできなさげです。

どうしてもBASIC認証をHTMLベースでやりたい場合は、モジュールを使うのが良さそうです。

いつのバージョンから含まれているのか判らないですが、Apacheに mod_auth_formっていうのが含まれているそうです。

他にも、同名のモジュール(中身は別物)で二つほど同じような事を実現するモジュールを作成されている方がいるようで。

mod_auth_form

mod_auth_form

どちらもちょっと古いので、Apacheに含まれているのを使った方が良さそうですが。

今後は公式の mod_auth_form を使ってHTMLでBASIC認証するようになるんでしょうね。

ではここからが試してみた事のメモ。

WEBサイトに認証をつけたい、けど、BASIC認証のダイアログは嫌だ、というよくわからない依頼、たまに有りますよね。認証処理を別途設置するコストを考えると、なんか無駄だなー、と思うんですが。

で、ちょうど人に聞かれたので、BASIC認証でダイアログ出さずに処理出来るか、ちょっとやってみました。

こんな感じになりました。
http://firstlife.jp/demo/20090628/login.html

で、以下がやり方。IE7で動かないので使う人も居ないだろうけど。

BASIC認証の設定方法は、Googleあたりで調べて貰うとして、BASIC認証がかかった領域の外に、以下の様なHTMLとPHPを置きます。

login.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
<form action="login.php" method="post">
username : <input type="text" name="username"><br />
password : <input type="password" name="password"><br />
<input type="submit">
</form>
</body>
</html>

login.php

<?php
$username = htmlentities($_POST['username']);
$password = htmlentities($_POST['password']);

if($username==""||$password==""){
	header('location: login.html');
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
<meta http-equiv="Refresh"content="0;url=http://<?php echo $username?>:<?php echo $password?>@firstlife.jp/demo/20090628/restrict/">
</head>
<body>
自動でログインしない場合は<a href="http://<?php echo $username?>:<?php echo $password?>@firstlife.jp/demo/20090628/restrict/">こちら</a>
</body>
</html>

で、login.htmlにアクセスすると上に書いたアドレスのような動きになります。

そうそう、ログインが失敗した時用に .htaccess に

ErrorDocument 401 /demo/20090628/login.html

みたいに書いておくと、ログイン失敗時もログイン画面に戻るのでいいかもね。

とまぁ、こんな感じです。モジュールの方はまた時間のあいたときに試してみます。