11

¿Es posible hacer la autenticación básica en Node.js como en Apache?Node.js http auth aut.

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

sé que si se utiliza Express o Conectar puedo añadir funcionalidad-ware medio y hacer la verificación del usuario, pero estoy tratando de restringir toda la zona (que no necesito para autenticar a los usuarios de una base de datos solo un par de usuarios definidos) - Estoy usando Ubuntu.

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

Eso es algo que puedo hacer, pero no estoy seguro de si "exponer" o escribiendo directamente el usuario y la contraseña en el código es lo suficientemente seguro.

Muchas gracias.

Respuesta

15

Passport proporciona un mecanismo de limpieza para implementar la autenticación básica. Lo uso en mi aplicación Node.js Express para proteger tanto mi UI basada en Angularjs como mi API RESTful. Para obtener el pasaporte en marcha y funcionando en su aplicación haga lo siguiente:

  • NPM instalar pasaporte

  • NPM instalar pasaporte-http (contiene objeto "BasicStrategy" para la autenticación básica)

  • Abran sus app.js y añadir lo siguiente:

    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

Su ejemplo funciona muy bien. En realidad es más simple (y más fácil de entender) que la proporcionada por pasaporte-http en GitHub. – Stilltorik

+0

Gracias Stilltorik! – TWright

3

Tenga una mirada en: user authentication libraries for node.js?

No responde a la pregunta 100% - pero tal vez ayuda.

+0

Hola @nivoc, gracias para responder, sí probablemente middle-ware es el camino a seguir, no he visto ninguna otra solución para este caso. – Jaime

12

Thi Put s

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

antes de la línea de

app.use(app.router); 

para proteger a todas las rutas por http autenticación básica

3

Creo buena opción podría ser http-auth módulo

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

Creo que una advertencia de que usted es el mantenedor de 'http-auth' sería apropiado aquí. –