Authorization Required…
さて、延々とEBのテストを行っている訳ではないのですが、だんだんとダウンロードが苦痛になってきている今日この頃です。それに毎回なにがしかのマイナートラブルを抱えたインストーラの相手をするのも…しかしながらもう既にどっぷりと浸かりきってしまった感一杯です。こうぬるぬるの感じでいると、あえてターミナルをたたいてコマンド入力するという行為自体が億劫になってきます。やはりそれほどExtensionBuilderというものは便利です。現行バージョンの話ですが、同じライブラリを利用しているにもかかわらず吐き出すswfファイルも容量が小さくなります。そういった諸々の詳細を突き詰めていくとEB独自の最適化が施されているのだろう事は予想されることですが、新しいバージョンではこの辺りの事象がどうなるのか少し楽しみだったりもします。で、わたしはと言うと、忙しい中でも取りあえず立ち上げておいて合間にコードを眺めると言うのが日課になっています。そんなこんなで、取りあえず殴り書きのメモが大量に発生して整理も追いついていなかったりします。まあ、それは置いておくとして今回もExtendScriptです。以前やったESからweb経由でデータを取得する処理の増補版をお届けしようと思います。まあ、またもやフォーラムがらみなのは忘れる事にしますね。
とりあえず基本形です。通常のサーバーにアクセスする例です。
var targetHost = SERVER NAME;
var cnnct = new Socket;
if (cnnct.open(targetHost + “:80”, “UTF-8”)) {
cnnct.write(“GET / HTTP/1.0\n”
+ “Content-Type: text/html; charset=UTF-8\n”
+ “User-Agent: Mozilla/5.0 (Windows NT 5.1; ja)\n”
+ “Connection: Keep-Alive\n\n”);
var rply = cnnct.read(999999);
cnnct.close();
}
alert (rply);
今まで散々出てきている例ですね。生成したソケットオブジェクトに対してwriteメソッドを通してリクエストを出します。サーバー側はリクエストに改行コードの連続を検出するとリクエストのフェッチを停止して要求されたコンテンツを返します。それを受け取るのがリードメソッドです。データを受け取った後コネクションをクローズして一連の動作は終了します。
では、BASIC認証が必要なサーバーに接続するとどうなるかと言うと以下の様になります。
401エラーが返されます。認証が必要だよって言われてますね。ではどうすれば良いかというと、認証データを渡してあげれば良いのです。う〜んそのまんまだ。まずはサンプルをどうぞ。
var userNm = “hogehoge”;
var passWord = “fugafuga”;
var targetHost = SERVER NAME;
var tgAuth = “/auth_area/index.html”;
var encodedData = base64(userNm + “:” + password);
var reply = “”;
var conn = new Socket;
var request = “GET ” + tgAuth + ” HTTP/1.1\n”
+ “Host: (targetHost)\n”
+ “Content-Type: text/html; charset=UTF-8\n”
+ “Authorization: Basic “+ encodedData +”\n\n”;
if (conn.open (targetHost + “:80”, “UTF-8”)) {
conn.write (request);
reply = conn.read(999999);
conn.close();
alert(reply);
}
function base64(binaryString) {
var keyStr = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=”;
var encoded = “”;
var c1, c2, c3;
var e1, e2, e3, e4;
var i = 0;
while(i < binaryString.length) {
c1 = binaryString.charCodeAt(i++);
c2 = binaryString.charCodeAt(i++);
c3 = binaryString.charCodeAt(i++);
e1 = c1 >> 2;
e2 = ((c1 & 3) << 4) | (c2 >> 4);
e3 = ((c2 & 15) << 2) | (c3 >> 6);
e4 = c3 & 63;
if (isNaN(c2)) {
e3 = e4 = 64;
} else if (isNaN(c3)) {
e4 = 64;
}
encoded = encoded + keyStr.charAt(e1) + keyStr.charAt(e2) +
keyStr.charAt(e3) + keyStr.charAt(e4);
}
return encoded;
}
ソケットオブジェクト生成して、リクエスト投げて、返されるのを待つという流れは変わりません。違うのはリクエストに追加された一行
+ “Authorization: Basic “+ encodedData +”\n\n”;
です。基本、これだけの違いです。しかしながら、ひとつお約束事があります。そうややこしい事ではありません。ユーザー名とパスワードをくっつけてbase64エンコーディングをかけると言う事です。
その為のファンクションが
function base64(binaryString) {
var keyStr = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=”;
var encoded = “”;
var c1, c2, c3;
var e1, e2, e3, e4;
var i = 0;
while(i < binaryString.length) {
c1 = binaryString.charCodeAt(i++);
c2 = binaryString.charCodeAt(i++);
c3 = binaryString.charCodeAt(i++);
e1 = c1 >> 2;
e2 = ((c1 & 3) << 4) | (c2 >> 4);
e3 = ((c2 & 15) << 2) | (c3 >> 6);
e4 = c3 & 63;
if (isNaN(c2)) {
e3 = e4 = 64;
} else if (isNaN(c3)) {
e4 = 64;
}
encoded = encoded + keyStr.charAt(e1) + keyStr.charAt(e2) +
keyStr.charAt(e3) + keyStr.charAt(e4);
}
return encoded;
}
こちらです。Adobeの中の人謹製のものとほぼ一緒です。以前散々役立たずとこきおろした代物ですが、これ位の文字数のエンコでは全く支障ありません。
と言う事で、実行結果は以下の様な感じとなります。