如何使用node.js和apache反向代理设置摘要式身份验证?

时间:2014-01-22 15:13:18

标签: node.js apache proxy digest-authentication passport.js

我在我的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配置?

0 个答案:

没有答案