2013-06-12 21 views
6

Sto cercando di suddividere questo esempio di passport.js con i suoi elementi più elementari. Continuo a ricevere un messaggio 401 (non autorizzato) e non riesco a capire perché. Qualsiasi aiuto sarebbe molto apprezzato.autenticazione passaporto non riuscita nell'esempio di base

Grazie!

Node.js di file:

var http = require('http'), 
express = require('express'), 
passport = require('passport'), 
LocalStrategy = require('passport-local').Strategy, 
flash = require('connect-flash'); 

var port = process.env.PORT || 8080; 

passport.serializeUser(function(user, done) { 
    done(null, user); 
}); 

passport.deserializeUser(function(obj, done) { 
    done(null, obj); 
}); 

passport.use(new LocalStrategy(
    function(username, password, done) { 
    console.log("LocalStrategy working..."); 
    return done(null, { id: 1, username: 'Joe', password: 'schmo'}); 
    } 
)); 

var app = express(); 

app.configure(function(){ 
    app.use(express.static(__dirname + '/app')); 
    app.use(express.cookieParser('big secret')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieSession()); 
    app.use(flash()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
}); 

app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

app.post('/login', passport.authenticate('local'), function (req, res) { 
    console.log("authenticated...."); 
    res.end(); 
}); 

app.listen(port); 

risposta

16

Che cosa significa il vostro look index.html o pagina di login come? Sul tuo post devi assicurarti di inviare almeno qualcosa nel corpo con un campo username e un password. Se invii un post senza questi, riceverai un messaggio di errore Missing credentials. Se si desidera cambiarli, è possibile modificare i parametri come mostrato su this guide.

È possibile controllare da soli aggiungendo un percorso per acquisire un errore di accesso e specificare tale percorso per la chiamata a passport.authenticate.

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/loginerror', failureFlash: true }), 
    function(req, res) { 
    res.redirect('/'); 
    }); 

app.get('/loginerror') function(req,res) { 
    console.log(req.flash('error')); 
    res.redirect('/login'); 
} 

Ho modificato l'esempio per aggiungere i moduli necessari. Inoltre, in caso di errore, viene visualizzato nella pagina di accesso. Ad esempio, se inserisci solo un nome utente e non una password, visualizzerai il messaggio di errore "Credenziali mancanti". Spero che questo ti aiuti!

var http = require('http'), 
    express = require('express'), 
    passport = require('passport'), 
    LocalStrategy = require('passport-local').Strategy, 
    flash = require('connect-flash'); 

var port = process.env.PORT || 8080; 

passport.serializeUser(function(user, done) { 
    done(null, user); 
}); 

passport.deserializeUser(function(obj, done) { 
    done(null, obj); 
}); 

passport.use(new LocalStrategy(
    function(username, password, done) { 
     console.log("LocalStrategy working..."); 
     return done(null, { id: 1, username: 'Joe', password: 'schmo'}); 
    } 
)); 

var app = express(); 

app.configure(function(){ 
    app.use(express.static(__dirname + '/app')); 
    app.use(express.cookieParser('big secret')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieSession()); 
    app.use(flash()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
}); 

app.get('/', function(req, res){ 

    var username = "not logged in"; 

    if (req.user) { 
     username = req.user.username; 
    } 

    var body = '<html><body>'; 
    body = body + '<p>' + username + '</p>'; 
    body = body + '<a href="/login">login</a>' 
    body = body + '</body></html>' 

    res.send(body); 
}); 

app.get('/login', function(req, res){ 

    var message = req.flash('error'); 
    var body = '<div><p>' + message + '</p></div>'; 
    body = body + '<form action="/login" method="post">'; 
    body = body + '<div><label>Username:</label>'; 
    body = body + '<input type="text" name="username"/><br/></div>'; 
    body = body + '<div><label>Password:</label>'; 
    body = body + '<input type="password" name="password"/></div>'; 
    body = body + '<div><input type="submit" value="Submit"/></div></form>'; 
    res.send(body); 
}); 

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }), 
    function(req, res) { 
     res.redirect('/'); 
}); 

app.listen(port); 
+2

Infatti, deve essere chiamato 'username'. Stavo usando solo 'name', riflettendo il mio schema di dati, e questo ha causato il fallimento del login ogni volta. Grazie, +1. –

+0

Ho avuto un refuso nel mio modello di EJ che elabora l'accesso dell'utente. Il nome utente non veniva inviato nel post. –

+1

@ArcaneEngineer, l'ho fatto per me ...! Grazie –

23

Tutti gli utenti di nuovi express.js (4.xe superiori) insieme a passport.js potrebbe sperimentare 'Missing credenziali degli guai solo perché i dati POST non viene analizzato per impostazione predefinita. Per risolvere il problema installare corpo-parser npm install body-parser e utilizzare nel codice:

var bodyParser = require('body-parser'); 
app.use(bodyParser.urlencoded({ extended: true })); 

Buon punto da @ivarni: app.use(bodyParser.urlencoded({ extended: true })); deve essere posto prima di iniettare qualsiasi middleware passaporto.

+0

Assolutamente questo. Vorrei solo aggiungere che 'app.use (bodyParser.urlencoded ({extended: true}));' deve essere chiamato prima di dire express per usare il passaporto. – ivarni

1

Per tutti gli utenti che ricevono ancora questo errore, ricontrolla i campi che invii effettivamente username & password. In caso contrario, è necessario passare i parametri aggiuntivi come suggerito nello documentation. Per esempio

passport.use(new passportLocal({ 
    usernameField: 'email', 
    passwordField: 'passwd' 
}, func..)); 
0

non credo che le risposte esistenti spiegano esplicitamente il problema che è: Passaporto strategia locale si lamenterà di credenziali mancanti se req.body.username e req.body.password mancano.

Spesso l'errore è che i dati POST non sono stati analizzati e che possono essere corretti utilizzando body-parser.

Problemi correlati