11

È possibile eseguire l'autenticazione di base in Node.js proprio come in Apache?Node.js http basic auth

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

so che se si utilizza Express o Collegare posso aggiungere funzionalità middle-ware e fare la verifica dell'utente, ma sto cercando di limitare l'intera area (non ho bisogno per autenticare gli utenti da un database solo un paio di utenti definiti) - Sto usando Ubuntu.

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

Questo è qualcosa che posso fare, ma non sono sicuro se "esporre" o scrivendo direttamente l'utente e la password nel codice è abbastanza sicuro.

Molte grazie.

risposta

15

Passport fornisce un meccanismo pulito per implementare l'autenticazione di base. Lo uso nella mia app Node.js Express per proteggere sia la mia interfaccia utente basata su Angularjs sia la mia API RESTful. Per ottenere il passaporto installato e funzionante in vostra applicazione effettuare le seguenti operazioni:

  • npm installare passaporto

  • NPM installare passaporto-http (contiene oggetto "BasicStrategy" per autenticazione di base)

  • Aprite i tuoi app.js e aggiungere il seguente:

    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

Il tuo esempio funziona alla grande. In realtà è più semplice (e più facile da capire) di quello fornito da passport-http su GitHub. – Stilltorik

+0

Grazie Stilltorik! – TWright

3

Dai un'occhiata alla: user authentication libraries for node.js?

Essa non risponde alla tua domanda 100% - ma forse aiuta.

+0

Ciao @nivoc, grazie per rispondere, sì, probabilmente il middleware è la strada da percorrere, non ho visto nessuna altra soluzione per questo scenario. – Jaime

12

put Thi s

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

prima della linea di

app.use(app.router); 

per proteggere tutte le rotte con http autenticazione base

3

Penso buona scelta potrebbe essere http-auth modulo

// 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

Penso che un disclaimer che tu sia il manutentore di 'http-auth' sarebbe appropriato qui. –