2015-12-26 19 views
5

Ho un'applicazione node.js progettata utilizzando il framework Express e il modulo http-auth, come segue:Utilizzando HTTP auth di base per determinati URL solo con il quadro espresso

var auth = require('http-auth'); 
var express = require('express'); 
// ... 
var mywebapp = express(); 
// ... 
if (usebasicauth) { 
    var basic = auth.basic({realm:"MyRealm", file:"/srv/config/passwd"}); 
    mywebapp.use(auth.connect(basic)); 
} 

mywebapp.use('/js', express.static(__dirname + '/files/js')); 
mywebapp.use('/css', express.static(__dirname + '/files/css')); 
// ... 

Tuttavia, non voglio per proteggere attività disponibili nelle directory /js e /css. Questo è quello che ho provato a fare:

if (usebasicauth) { 
    var basic = auth.basic({realm:"MyRealm", file:"/srv/config/passwd"}); 
    mywebapp.use(function(req, res, next) { 
    if (/^\/(css|js)/.test(req.url)) { 
     next(); 
    } 
    else { 
     auth.connect(basic); 
    } 
    }); 
} 

Cercando di accedere agli URL sotto /css e /js lavoro come previsto; tuttavia, altri URL non vengono mai caricati.

Come posso fare in modo che altri URL funzionino come previsto?

risposta

8

L'ordine di mywebapp.use è importante. Se si ha il primo mywebapp.use(auth.connect(basic)); allora sarà usato per ogni richiesta ma se si cambia l'ordine passerà la statica e sarà usato solo per ciò che è dopo di esso.

Le funzioni del middleware vengono elaborate in ordine di aggiunta.

Quindi seguire dovrebbe fare quello che vuoi.

// no auth for statics 
mywebapp.use('/js', express.static(__dirname + '/files/js')); 
mywebapp.use('/css', express.static(__dirname + '/files/css')); 
// auth reguired from here 
mywebapp.use(auth.connect(basic)); 

Se si posiziona al di sopra mywebapp.use(auth.connect(basic)); express.static sarà necessitano piuttosto di autenticazione per esso pure.

// auth reguired from here 
mywebapp.use(auth.connect(basic)); 
// auth required for statics as well 
mywebapp.use('/js', express.static(__dirname + '/files/js')); 
mywebapp.use('/css', express.static(__dirname + '/files/css')); 
3

Si può fare qualcosa di simile, così https://gist.github.com/gevorg/7168d5f02c1ca5362b2a#file-specific-path-js

// Express module. 
var express = require('express'); 

// 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(function(req, res, next) { 
    if ('/specific/path' === req.path) { 
     next(); 
    } else { 
     (auth.connect(basic))(req, res, next); 
    } 
}); 

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

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

// Start server. 
app.listen(1337);