无法使用节点请求模块进行基本的 HTTP 身份验证
Cannot make a basic HTTP auth with node request module
我正在使用 mocha 测试我的应用程序,我想测试一个 HTTP 响应 header 代码,具体取决于我使用基本 HTTP 身份验证发送给它的凭据。
在客户端,我对服务器进行了 AJAX 调用,如下所示:
$.ajax({
type: 'GET',
url: url,
beforeSend: function(xhr){
xhr.setRequestHeader("Authorization", "Basic " +btoa("username:password") );
},
success:function(rsp){
// do whatever I need;
}
});
而且效果很好。如果凭据错误,则网站将以 302
响应
在我的测试文件 (mocha) 中,我尝试发送相同的请求但由于某种原因它不起作用。
这是我尝试过的不同方式:
it('should return 302 because wrong credentials', function(done){
var auth = "Basic " +new Buffer("username:password").toString('base64');
var options = {
url: url,
headers: {
"Authorization": auth
}
};
request.get(options, function(err, res, body){
console.log(res.statusCode);
assert.equal(302, res.statusCode);
done();
});
});
-----------------------
it('should return 302 because wrong credentials', function(done){
request.get(url,
{
'auth': {
'username':'username',
'password':'password'
}
},
function(err, res, body) {
assert.equal(302, res.statusCode);
done();
});
});
但是,无论如何,我得到一个 HTTP 200 响应代码。
那为什么呢?我该如何处理?
Ps:对于那些非常谨慎的人来说,客户端不会被公开使用,因此我允许自己将凭据放入其中。
编辑:更准确地说,您将在下面找到处理请求的服务器代码(NodeJS)
function checkAuth(req, result, next){
var header = req.headers['authorization'];
// Ignore the preflight OPTION call
if(header != undefined){
var tmp = header.split(/\s+/).pop();
var credentials = new Buffer(tmp, 'base64').toString();
var parts = credentials.split(/:/);
var username = parts[0];
var password = parts[1];
bcrypt.compare(username, config.get.username, function(err, res){
if(res){
bcrypt.compare(password, config.get.password, function(err, res){
if(res){
next();
} else {
return result.redirect('/');
}
});
} else {
return result.redirect('/');
}
});
} else {
return result.redirect('/');
}
}
app.get('/server', checkAuth, getData.getMessages);
和方法getData.getMessage()
return如下:
return result.status(200).json(res);
request
自动跟随重定向,因此您需要禁用 followRedirect
才能阅读 3xx
回复。
var options = {
url: url,
followRedirect: false,
headers: {
"Authorization": auth
}
};
对于 HTTP 基本身份验证,您还可以使用 http-auth 模块。
// Authentication module.
var auth = require('http-auth');
var basic = auth.basic({
realm: "Simon Area.",
file: __dirname + "/../data/users.htpasswd" // gevorg:gpass, Sarah:testpass ...
});
// Creating new HTTP server.
http.createServer(basic, function(req, res) {
res.end("Welcome to private area - " + req.user + "!");
}).listen(1337);
我正在使用 mocha 测试我的应用程序,我想测试一个 HTTP 响应 header 代码,具体取决于我使用基本 HTTP 身份验证发送给它的凭据。
在客户端,我对服务器进行了 AJAX 调用,如下所示:
$.ajax({
type: 'GET',
url: url,
beforeSend: function(xhr){
xhr.setRequestHeader("Authorization", "Basic " +btoa("username:password") );
},
success:function(rsp){
// do whatever I need;
}
});
而且效果很好。如果凭据错误,则网站将以 302
响应在我的测试文件 (mocha) 中,我尝试发送相同的请求但由于某种原因它不起作用。
这是我尝试过的不同方式:
it('should return 302 because wrong credentials', function(done){
var auth = "Basic " +new Buffer("username:password").toString('base64');
var options = {
url: url,
headers: {
"Authorization": auth
}
};
request.get(options, function(err, res, body){
console.log(res.statusCode);
assert.equal(302, res.statusCode);
done();
});
});
-----------------------
it('should return 302 because wrong credentials', function(done){
request.get(url,
{
'auth': {
'username':'username',
'password':'password'
}
},
function(err, res, body) {
assert.equal(302, res.statusCode);
done();
});
});
但是,无论如何,我得到一个 HTTP 200 响应代码。
那为什么呢?我该如何处理?
Ps:对于那些非常谨慎的人来说,客户端不会被公开使用,因此我允许自己将凭据放入其中。
编辑:更准确地说,您将在下面找到处理请求的服务器代码(NodeJS)
function checkAuth(req, result, next){
var header = req.headers['authorization'];
// Ignore the preflight OPTION call
if(header != undefined){
var tmp = header.split(/\s+/).pop();
var credentials = new Buffer(tmp, 'base64').toString();
var parts = credentials.split(/:/);
var username = parts[0];
var password = parts[1];
bcrypt.compare(username, config.get.username, function(err, res){
if(res){
bcrypt.compare(password, config.get.password, function(err, res){
if(res){
next();
} else {
return result.redirect('/');
}
});
} else {
return result.redirect('/');
}
});
} else {
return result.redirect('/');
}
}
app.get('/server', checkAuth, getData.getMessages);
和方法getData.getMessage()
return如下:
return result.status(200).json(res);
request
自动跟随重定向,因此您需要禁用 followRedirect
才能阅读 3xx
回复。
var options = {
url: url,
followRedirect: false,
headers: {
"Authorization": auth
}
};
对于 HTTP 基本身份验证,您还可以使用 http-auth 模块。
// Authentication module.
var auth = require('http-auth');
var basic = auth.basic({
realm: "Simon Area.",
file: __dirname + "/../data/users.htpasswd" // gevorg:gpass, Sarah:testpass ...
});
// Creating new HTTP server.
http.createServer(basic, function(req, res) {
res.end("Welcome to private area - " + req.user + "!");
}).listen(1337);