node.jsでbasic認証を使ってhttps接続する
nodeのバグを踏んだりしてたら4時間かかってしまったのでメモしておく。
■HTTP接続
以下のようにしてHTTPクライアントを生成し、ホストに接続することができる。
var host = 'www.example.com';
var header = {"Host": host};
var client = http.createClient(
80,
host,
false,
false
).
client.request(
"GET",
"/",
header
);
createClienetはどうやら廃止される方向らしいので以下のように書きなおす。
var http = require('http');
var host = 'www.example.com';
var req = http.get(
{
"host" : host,
"port" : 80,
"path" : "/"
},
function(res) {
console.log("Got response: " + res.statusCode);
}
);
req.on('error', function(e){
console.log(e);
})
■Basic認証+HTTP接続
以下のようにしてHTTPクライアントを生成し、ホストに接続することができる。
var username = 'hoge';
var password = 'fuga';
var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
var host = 'www.example.com';
var header = {
"Host" : host,
"Authorization" : auth
};
var client = http.createClient(
80,
host,
false,
false
).
client.request(
"GET",
"/",
header
);
createClienetはどうやら廃止される方向らしいので以下のように書きなおす。
var http = require('http');
var host = 'www.example.com';
var req = http.get(
{
"host" : host,
"port" : 80,
"path" : "/",
"auth" : "username:password"
},
function(res) {
console.log("Got response: " + res.statusCode);
}
);
req.on('error', function(e){
console.log(e);
})
■Basic認証+HTTPS接続
失敗例
以下のようにしてHTTPSクライアントを生成しても、ホストに接続することはできない。
var username = 'hoge';
var password = 'fuga';
var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
var host = 'www.example.com';
var header = {
"Host" : host,
"Authorization" : auth
};
var client = http.createClient(
443,
host,
true,
false
).
client.request(
"GET",
"/",
header
);
実行してもエラーがでる。
参考
上述のように失敗するのでhttpsモジュールを使う。
■Basic認証+HTTPS接続
以下のようにすることで、HTTPSクライアントでBasic認証を使うことができる。
var https = require('https');
var host = 'www.example.com';
var username = 'hoge';
var password = 'fuga';
var auth = 'Basic ' + new Buffer(username + ':' + password).toString('base64');
var options = {
"host" : host,
"port" : 443,
"path" : '/',
"method" : 'GET',
"Authorization" : auth
};
var request = https.request(
options,
function(response) {
console.log("statusCode: ", response.statusCode);
console.log("headers: ", response.headers);
}
);
request["_headers"]["Authorization"] = auth;// ...(a)
request["_headerNames"]["Authorization"] = 'Authorization';// ...(b)
request.end();
optionsにAuthorizationをセットするだけではBasic認証が成功しなかった。認証用のヘッダが正しく付加されるように、強引に(a)と(b)を加えた。
参考
■後述
現在のnodeのバージョンでは以下のようにして簡単にhttpsでBasic認証を行うことができた。
var http = require('https');
var host = 'www.example.com';
var req = http.get(
{
"host" : host,
"port" : 443,
"path" : "/",
"auth" : "username:password"
},
function(res) {
console.log("Got response: " + res.statusCode);
}
);
req.on('error', function(e){
console.log(e);
})
参考
TrackBack URL :
Comments (0)