@blog.justoneplanet.info

日々勉強

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);
})

参考

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment