我在我的node.js应用程序中使用护照进行摘要身份验证。这在直接访问应用程序(在端口3000上)时工作正常但是我需要使用apache设置反向代理,这样我就可以在端口80上访问我的应用程序。
我在apache conf中使用以下内容:
<IfModule mod_proxy.c>
ProxyRequests On
ProxyPreserveHost On
ProxyStatus On
<Location /status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>
ProxyPass /proxy http://localhost:3000
ProxyPassReverse /proxy http://localhost:3000
</IfModule>
我的app.js:
var express = require('express')
, passport = require('passport')
, app = express()
, util = require('util')
, DigestStrategy = require('passport-http').DigestStrategy;
var PORT = 3000;
var users = [
{ id: 1, username: 'bob', password: 'secret', email: 'bob@example.com' }
, { id: 2, username: 'joe', password: 'birthday', email: 'joe@example.com' }
];
function findByUsername(username, fn) {
for (var i = 0, len = users.length; i < len; i++) {
var user = users[i];
if (user.username === username) {
return fn(null, user);
}
}
return fn(null, null);
}
passport.use(new DigestStrategy({ qop: 'auth' },
function(username, done) {
findByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
return done(null, user, user.password);
})
},
function(params, done) {
// asynchronous validation, for effect...
process.nextTick(function () {
// check nonces in params here, if desired
return done(null, true);
});
}
));
app.enable('trust proxy');
app.use(passport.initialize());
app.get('/test-no-auth', function(req, res){
res.send('ok.');
});
app.get('/test-auth', passport.authenticate('digest', { session: false }), function(req, res){
res.send('ok.');
});
app.listen(PORT, function(){
console.log("listening on port "+PORT);
});
当我使用curl测试时:
curl --digest -u "bob:secret" http://localhost:3002/test-auth
我按预期收到“ok”,但是在通过代理时:
curl --digest -u "bob:secret" http://localhost/proxy/test-auth
我总是得到“未经授权”。我怀疑问题必须在apache conf中,而不是在node.js代码中。那么我应该准确地把它放在conf中,或者问题不在于apache配置?