0

Ich versuche, die Authentifizierung in node.js Anwendung mit Passpjs mit Pass-lokalen Strategie zu implementieren. Ich lese sorgfältig die Dokumentation und verwende alles, was in der Dokumentation vorgeschlagen wurde. Aber ich bekomme jedes Mal die Meldung "fehlende Anmeldedaten".Passportjs lokale Strategie fehlende Anmeldeinformationen Fehlermeldung

Node.js Datei:

var http = require('http'); 
var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var passport = require('passport'); 
var localStrategy = require('passport-local').Strategy; 

var app = express(); 
app.set('port', process.env.PORT || 3000); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(cookieParser()); 
app.use(require('body-parser').urlencoded({ 
    extended: true 
})); 
app.use(require('express-session')({ 
    secret: '[email protected]', 
    resave: true, 
    saveUninitialized: true 
})); 
app.use(require('flash')()); 
app.use(passport.initialize()); 
app.use(passport.session()); 

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

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

passport.use(new localStrategy(function (username, password, done) { 
    var displayName = 'Test User', 
     loginUsername = 'testuser', 
     loginPassword = 'test', 
     user = { 
      "id": '1001', 
      "display": displayName, 
      "username": loginUsername, 
      "password": loginPassword, 
      "loggedin": '1' 
     }; 
    if (loginUsername != username && loginPassword != password) { 
     return done(null, false, { 
      type: "error", 
      message: 'Either username or password is wrong.' 
     }); 
    } 
    return done(null, user); 
})); 

// routes 

/* GET Home page. */ 
app.get('/', passport.authenticate('local', { 
    failureRedirect: '/login', 
    failureFlash: true 
}), function (req, res, next) { 
    res.render('index', { 
     title: 'Express' 
    }); 
}); 

/* GET user login. */ 
app.get('/login', function (req, res, next) { 
    res.render('login', { 
     title: 'Login' 
    }); 
}); 

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

/* GET logout page. */ 
app.get('/logout', function (req, res, next) { 
    req.logout(); 
    res.redirect('/login'); 
}); 

// catch 404 and forward to error handler 
app.use(function (req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handlers 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function (err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function (err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: {} 
    }); 
}); 

var server = http.createServer(app).once('error', function (err) { 
    if (err.code === 'EADDRINUSE') { 
     console.log('port is currently in use'); 
    } 
}).listen(app.get('port'), function() { 
    // console will print the message 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

Ich habe eine viel suchen, konnte aber keine Lösung aus anderer Post finden. Als ich die Konsole sah und diese Ausgabe fand.

Express server listening on port 3000 
GET /login 200 381.482 ms - 465 
GET /stylesheets/style.css 304 1.685 ms - - 
POST /login 302 24.303 ms - 58 
GET/302 2.419 ms - 68 
GET /login 200 32.336 ms - 528 
GET /stylesheets/style.css 304 0.563 ms - - 

package.json

{ 
    "name": "passport-demo", 
    "version": "0.0.0", 
    "private": true, 
    "scripts": { 
    "start": "node ./app.js $PORT" 
    }, 
    "dependencies": { 
    "body-parser": "~1.13.2", 
    "cookie-parser": "~1.3.5", 
    "debug": "~2.2.0", 
    "express": "~4.13.1", 
    "jade": "~1.11.0", 
    "morgan": "~1.6.1", 
    "serve-favicon": "~2.3.0", 
    "express-session": "~1.13.0", 
    "passport": "~0.3.2", 
    "passport-local": "~1.0.0", 
    "flash": "~1.1.0" 
    } 
} 

Weiß jemand, was ich hier fehlt?

Danke!

+0

Was ist der Feldname des Textfeldes Benutzername und Kennwort-Textfeldes in Login-Vorlage? –

+0

@HirenS. Ich benutze Namen 'Benutzername' für Benutzername Eingabefeld und' Passwort' für Passwort Eingabefeld. Ich weiß über Optionen zum Überschreiben von Eingabefeldern im Pass. –

Antwort

3

passport.authenticate('local') Middleware wird verwendet, wenn Sie versuchen, Benutzeranmeldeinformationen vom POST-Hauptteil zu überprüfen. So sollte es nur für POST /login Route verwendet werden. Aber Sie verwenden diese Middleware auch in GET / und damit den Fehler, da diese Route keinen POST-Body hat.

Um zu überprüfen, ob ein Benutzer angemeldet ist, verwendet req.isAuthenticated() Methode:

const isAuthenticated = function (req, res, next) { 
    if(req.isAuthenticated()) return next(); 
    else res.redirect('/login') 

} 
app.get('/', isAuthenticated, function (req, res, next) { 
    res.render('index', { 
     title: 'Express' 
    }); 
}); 
+0

Danke, das hat mir geholfen, das Problem zu lösen. –

Verwandte Themen