1

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

Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
skywlkr
  • 1,185
  • 11
  • 22
  • I do not know how passport works but you are passing it to Express as middleware in the section at the top. Does the function it return call next() etc? It would also help to see what is getting exercised on the server. – ravi Jun 04 '13 at 13:04

1 Answers1

0

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.

jewelfarazi
  • 460
  • 4
  • 10