11

是否有可能像在Apache中一样在Node.js中执行基本身份验证?Node.js http basic auth

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

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

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

这是我能够做到的,但我不知道是否“曝光”或直接写在代码中的用户名和密码足够安全。

非常感谢。

回答

15

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

  • NPM安装护照

  • NPM安装护照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); 
    
+4

你的例子效果很好。它比GitHub上的passport-http提供的更简单(也更易于理解)。 – Stilltorik

+0

谢谢Stilltorik! – TWright

12

认沽THI小号

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

前行至

app.use(app.router); 

,以保护所有路由与HTTP基本身份验证

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 + "!"); 
}); 
+3

我认为你是'http-auth'的维护者的免责声明在这里是合适的。 –