Node.js http基本身份验证

时间:2011-09-08 05:07:59

标签: javascript authentication ubuntu node.js basic-authentication

是否可以像在Apache中一样在Node.js中执行基本身份验证?

http://doc.norang.ca/apache-basic-auth.html

我知道如果使用Express或Connect我可以添加中间件功能并进行用户验证,但我试图限制整个区域(我不需要从数据库中验证用户只是几个定义的用户) - 我正在使用Ubuntu。

https://github.com/kaero/node-http-digest

这是我可以做的,但我不确定“暴露”或直接在代码中写入用户和密码是否足够安全。

非常感谢。

4 个答案:

答案 0 :(得分:17)

Passport提供了一种实现基本身份验证的简洁机制。我在我的Node.js Express应用程序中使用它来保护我的基于Angularjs的UI以及我的RESTful API。要在您的应用程序中启动并运行护照,请执行以下操作:

  • npm安装护照

  • npm install passport-http(包含基本身份验证的“BasicStrategy”对象)

  • 打开app.js并添加以下内容:

    var passport = require('passport')    
    var BasicStrategy = require('passport-http').BasicStrategy
    
    passport.use(new BasicStrategy(
      function(username, password, done) {
        if (username.valueOf() === 'yourusername' &&
          password.valueOf() === 'yourpassword')
          return done(null, true);
        else
          return done(null, false);
      }
    ));
    
    // Express-specific configuration section
    // *IMPORTANT*
    //   Note the order of WHERE passport is initialized
    //   in the configure section--it will throw an error
    //   if app.use(passport.initialize()) is called after
    //   app.use(app.router) 
    app.configure(function(){
      app.use(express.cookieParser());
      app.use(express.session({secret:'123abc',key:'express.sid'}));
      app.set('views', __dirname + '/views');
      app.set('view engine', 'jade');
      app.set('view options', {
        layout: false
      });
      app.use(express.bodyParser());
      app.use(express.methodOverride());
      app.use(express.static(__dirname + '/public'));
      app.use(passport.initialize());
      app.use(app.router);
      app.use(logger);
    });
    
    // Routes
    
    app.get('/', passport.authenticate('basic', { session: false }), routes.index);
    app.get('/partials/:name', routes.partials);
    
    // JSON API
    
    app.get('/api/posts', passport.authenticate('basic', { session: false }), api.posts);
    app.get('/api/post/:id', passport.authenticate('basic', { session: false }), api.post)
    // --Repeat for every API call you want to protect with basic auth--
    
    app.get('*', passport.authenticate('basic', { session: false }), routes.index);
    

答案 1 :(得分:12)

把这个

app.use(express.basicAuth(function(user, pass) {
  return user === 'test' && pass === 'test';
}));

之前的

app.use(app.router);

使用http basic auth保护所有路由

答案 2 :(得分:3)

看看: user authentication libraries for node.js?

它没有100%回答你的问题 - 但也许有帮助。

答案 3 :(得分:3)

我认为好的选择可能是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 ...
});

// Application setup.
var app = express();
app.use(auth.connect(basic));

// Setup route.
app.get('/', function(req, res){
  res.send("Hello from express - " + req.user + "!");
});