Cannot post in an Express + Passport app / Authentication test

≡放荡痞女 提交于 2019-12-11 07:01:38

问题


I am trying to use Passport as an authentication middleware with Express - and Angular, if it matters. I have just started to know these frameworks and I experiment with a simple test login in the app. These are the relevant code snippets in my root/app.js that should do the login method:

var express = require('express'),
  routes = require('./routes'),
  api = require('./routes/api'),
  passport = require('passport'),
  LocalStrategy = require('passport-local').Strategy;

...

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.static(__dirname + '/public'));
  app.use(passport.initialize());
  app.use(app.router);
});

...

// Authentication with Passport.js

var testUser = {
  username: 'patrik',
  password: '123'
}

passport.use(new LocalStrategy(
    function(username, password, done) {
      if(username == testUser.username) {
        if(password == testUser.password) {
          return done(null, username);
        } else {
          return done(null, false, { message: 'Incorrect password.' });
        }
      } else {
        return done(null, false, { message: 'Incorrect username.' });
      }
    }
));

...

app.post('/login',
    passport.authenticate('local', { successRedirect: '/',
      failureRedirect: '/login',
      failureFlash: true })
);

Here is my template code in index.jade:

form(method='post',action='/login')
      div
        label Username:
        input(type='text',name='username')
      div
        label Password:
        input(type='password',name='password')
      div
        input(type='submit',value='Log in')

And my problem is that if I try to post, I get this response from the browser:

Response Cannot POST /login


回答1:


You have to update some of express and passport requirements for this to work. Such as session, failureflash messages, serialize and deserialize. Here is updated code snippet for you. first you have to install "connect-flash" for this line of codes "failureFlash : true". But it will work without flash.

npm install connect-flash

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

Then update express environments:

app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.static(__dirname + '/public'));
    app.use(express.cookieParser());
    // required for passport
    app.use(express.session({ secret: 'my secret'}));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
});

// Authentication with Passport.js

var testUser = {
  username: 'patrik',
  password: '123'
}

passport.use(new LocalStrategy(
  function(username, password, done) {

    if (username === testUser.username && password === testUser.password) {
      return done(null, {username: username});
    } else {
      return done(null, {username: 'username or password incorrect!'});
    }

    return done(null, false);
  }
));

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

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

app.get('/', routes.index);

app.post('/login',
    passport.authenticate('local', { 
        successRedirect: '/',
        failureRedirect: '/login',
        failureFlash: true })
    );

And here is a little update for your routes/index.js file:

exports.index = function(req, res){
    var user = '';
    if(req.session.passport.user !== undefined) user = req.user.username;

    res.render('index', {title: user});
};

I hope these will help you to understand login with passport.



来源:https://stackoverflow.com/questions/16894338/cannot-post-in-an-express-passport-app-authentication-test

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!