0

Я пытаюсь реализовать аутентификацию в приложении node.js с использованием паспортов с паспорт-локальной стратегией. Я внимательно прочитал документацию и использовал все, что было предложено в документации. Но каждый раз я получаю сообщение «пропустить учетные данные».Локальная стратегия Passportjs отсутствует сообщение об ошибке

Node.js Файл:

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')); 
}); 

Я поиск через много, но не смог найти решение из другого поста. Когда я увидел консоль и нашел этот выход.

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" 
    } 
} 

Кто-нибудь знает, что я здесь отсутствует?

Спасибо!

+0

Что такое имя поля имя пользователя текстовое поле и пароль текстовое поле в шаблоне логина? –

+0

@ HirenS. Я использую имя «имя пользователя» для поля ввода имени пользователя и пароль для ввода пароля. Я знаю о параметрах для имени полей ввода перезаписи в паспорте. –

ответ

3

passport.authenticate('local') промежуточное программное обеспечение используется, когда вы пытаетесь проверить учетные данные пользователя из тела POST. Поэтому его следует использовать только для маршрута POST /login. Но вы также используете это промежуточное программное обеспечение в GET / и, следовательно, ошибку, так как этот маршрут не имеет никакого тела POST.

Чтобы проверить, если пользователь вошел в систему, используйте req.isAuthenticated() метод:

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

Спасибо, это помогло мне решить проблему. –

Смежные вопросы