【Ajax】Basic認証ページから読み込む
XMLHttpRequestオブジェクトのopenメソッド引数には、オプションで、省略可ですが、
ユーザー名とパスワードを入れられるようになっています。
そこで、とりあえず、Basic認証を試してみます。ま、しょせんBasic認証ですから、あまり安全じゃありませんが(^^;そこを理解した上で、便利には使えるかもしれません。
#Ajaxを使えばMD5などで自力で毎回コードを変更し、パスワードもネットワークに流さない、認証やセッションも可能だという気がして、こないだ考えた(頭いたくなりそうな^^;)ロジックがあるんですが、それはまた、閑なときに書いてみます。
【動作ブラウザ】
*Opera8とSafari1は、入力要求ダイアログがでてしまいました。。。
| win |
mac |
linux |
| n7 | m1 | e6 | o7 | o8 |
n7 | m1 | e5 | s1 |
n7 | m1 | k3 |
| ○ | ○ | ○ | × | △ |
○ | ○ | × | △ |
○ | ○ | ○ |
name:「ajax」、password:「test」です(入力済み^^;;;)。
認証ページは、http://jsgt.org/ajax/ref/test/auth/basic2/auth/index.htm
ここへ出力します-->
<!-- Ajax簡易ライブラリ jslb_ajax.js
ライブラリ更新情報:http://jsgt.org/mt/archives/01/000409.html
-->
<script languege = "JavaScript"
src = "http://jsgt.org/ajax/ref/lib/jslb_ajax034.js"
charset = "utf-8"></script>
<script language = "JavaScript">
<!--
//コールバック関数 ( 受信時に実行されます )
function on_loaded426(oj)
{
//レスポンスを取得
var res = decodeURIComponent(oj.responseText)
//レスポンスされた文字列を表示
echo426(res)
}
//出力
function echo426(msg)
{
document.getElementById('echo426div').innerHTML += msg + '<br>'
}
//-->
</script>
<body>
<form name="auth">
name :<input name="name" type="text" value="ajax"><br>
password:<input name="pwd" type="password" value="test"><br>
<input type = "button"
value = "認証ページのHTMLを読み込み、表示します"
onclick = "
sendRequest(
on_loaded426, //コールバック関数
'', //data
'POST', //HTTPメソッド
'http://jsgt.org/ajax/ref/test/auth/basic2/auth/index.htm', //url
true, //非同期
true, //強制ロード
this.form.name.value, //ユーザー名
this.form.pwd.value //パスワード
)">
</form>
<hr>
<!-- ここへ出力します -->
<div id="echo426div"></div>
# ちなみに、
高度な JavaScript 技集などのbase64エンコードを使わせてもらえば、open()メソッドの引数を使わなくても、自前でリクエストヘッダをセットすることで、認証可能です。
簡単に説明すると、ユーザー名とパスワードをコロン「:」でつないだ文字列をbase64でエンコードしてからsetRequestHeader()でAuthorizationヘッダをセットします。
//base64 Basic認証
var b64 = base64encode(user+':'+password)
oj.setRequestHeader('Authorization',' Basic '+b64);
ヘッダを使って認証サンプル
http://jsgt.org/ajax/ref/test/auth/basic2/test21.htm
#厳密に言うと、サーバーが先に401などを返して、Basicの認証作業は、確か、そこから始まるわけですから、最初からパスワードを送るんではなくて、 statusコードの401や407を拾ってむにゃむにゃする方法があるような気もしています。。。どうでしょう? ←試してみたら、ダミーのsend後、401が返ってきた瞬間にブラウザがダイアログ出します(^^;;。でも、それよりも、passwordをつけて送出した時点で、最初から、リクエストに「Authorization」ヘッダをつけてくれるので、Ajaxの場合、通常のブラウザUIが行っているような無駄なダミーリクエストのやり取りは無いんですね。
参考:
RFC2617
HTTP 認証: 基本アクセス認証及びダイジェストアクセス認証
http://www.studyinghttp.net/cgi-bin/rfc.cgi?2617
Basic認証ページを用意する
http の認証認定方式にはBASIC 認証がよく利用されています。しかし、通信経路でパケットを盗聴されると簡単にパスワードがばれてしまいます。もう少し、強度の強いものでは、Digest 認証 があります。こちらはMD5でパスワード自体は流れませんので多少安心です。でも、今回は、BASIC 認証です。Digest 認証は、またの機会に、、、。
[ パスワードファイルを作る ]
htpasswd で、たとえば、/home/myhome/というディレクトリへ「.htpasswd」というファイルを自動生成します。 このディレクトリは、安全のため、Webから直接アクセスできない場所にします。
/usr/bin/htpasswd -c /home/myhome/.htpasswd ajax
こう打つと、下記のように聞かれますのでパスワードを入れます。
New password:●●●●
Re-type new password:●●●●
Adding password for user ajax
これで、パスワードファイルはできあがりです。試しに、/home/myhome/.htpasswdを開いてみると、
ajax:QBFDL1cQxI2cQ
こんなデータが入っています。作成したこのパスワードファイルに、更に追加でユーザを登録したい場合には、 下記のように、-c オプションを付けずに実行します。
/usr/bin/htpasswd /home/myhome/.htpasswd ajax2
[ .htaccessを用意する ]
下記の内容を.htaccessという名前のファイルにして、認証したいディレクトリへ置きます。(httpd.confへ指定する方法もあります)
AuthUserFile /home/myhome/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID(ajax) and password(test)"
AuthType Basic
require valid-user
これで、.htaccessを置いたディレクトリ以下へアクセスしようとすると、認証入力を要求するダイアログが開くようになります。
で、Ajaxでは、上記で設定したユーザー名とパスワードを
open()メソッドの引数で下記のように指定します。
oj.open( 'POST' , 'http://jsgt.org/ajax/himitu/test.htm' , true , 'ajax', 'test' )
で、Ajaxで読み込む、このtest.htmに、日本語を使うなら、URIエンコード(encodeURIComponent())しておくのが安全です。今回使っている、URIエンコード済み文字列は、下記のものです。参考:
PHPとJavaScriptのURIエンコードを比較
ok!%20This%20data%20was%20loaded%20from%20%3Cb%3EBasic%20authentication%3C/b%3E%20page.%20%E3%81%93%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%E3%80%81%E8%AA%8D%E8%A8%BC%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%8B%E3%82%89%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BE%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82
ただ、
しょせん、「手軽に盗聴可能なBasic認証」であることを忘れてはいけません
また、上記open()メソッドの引数のように、
ユーザー名とパスワードをスクリプトに直接埋め込むなどは、言語道断(^^;;であることも忘れないようにしましょう。
ってことで↓こんなのも試してみました。
【Ajax】SSL+Basic認証ページから読み込む
http://jsgt.org/mt/archives/01/000432.html