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'的維護者的免責聲明在這裏是合適的。 –