简体   繁体   中英

Node JS Express, Passport JS, and Android Device Authentication Issues

  1. I am currently implementing a login page via Node JS Express and Passport using Passport's local strategy : http://www.passportjs.org/packages/passport-local/ .
  2. The database is using MongoDB.
  3. The problem that is occurring is I am unable to login successfully (sometimes I can, but it is not consistent) on an android phone and android tablet with User A .
  4. The response being returned is a 401 (unauthorized error).
  5. I have verified that I can log in successfully consistently with User A from a desktop computer, and also verified I can login on iOS devices (iPhone and iPad).

Does anyone have any suggestions, and / or know what the issue is?

Below is the code that executes the authentication

app_api/config/passport.js

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var mongoose = require('mongoose');
var User = mongoose.model('User');

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

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

passport.use(new LocalStrategy({
    usernameField: 'email'
  },
  function(username, password, done) {
    User.findOne({ email: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, {
          message: 'Incorrect username.'
        });
      }
      if (!user.validPassword(password)) {
        return done(null, false, {
          message: 'Incorrect password.'
        });
      }
      return done(null, user);
    });
  }
));

app_api/controllers/authentication.js

var passport = require('passport');
var mongoose = require('mongoose');
var User = mongoose.model('User');

var sendJSONresponse = function(res, status, content) {
  res.status(status);
  res.json(content);
};

module.exports.test = function(req, res) {
  sendJSONresponse(res, 200, { 'status' : 'success' });
};

module.exports.register = function(req, res) {
  if(!req.body.name || !req.body.email || !req.body.password) {
    sendJSONresponse(res, 400, {
      "message": "All fields required"
    });
    return;
  }

  var user = new User();

  user.name = req.body.name;
  user.email = req.body.email;

  user.setPassword(req.body.password);
  user.setShowResume(false);

  user.save(function(err) {
    var token;
    if (err) {
      sendJSONresponse(res, 404, err);
    } else {
      token = user.generateJwt();
      sendJSONresponse(res, 200, {
        'token' : token
      });
    }
  });

};

module.exports.login = function(req, res) {
  if(!req.body.email || !req.body.password) {
    sendJSONresponse(res, 400, {
      'message': 'All fields required'
    });
    return;
  }

  passport.authenticate('local', function(err, user, info){
    var token, showResume;

    if (err) {
      sendJSONresponse(res, 404, err);
      return;
    }

    if(user){
      token = user.generateJwt();
      showResume = user.showResume;
      sendJSONresponse(res, 200, {
        'token' : token,
        'showresume': showResume
      });
    } else {
      sendJSONresponse(res, 401, info);
    }
  })(req, res);
};

module.exports.logout = function(req, res) {
 req.logout();
 res.redirect('/');
};

Below is the controller app_server/controllers/index.js and the function logincontinue which calls the app_api/controllers/authentication.js file and its function login :

app_server/controllers/index.js

var request = require('request');

var apiOptions = {
  server : "http://localhost:3000"
};

if (process.env.NODE_ENV === 'production') {
  apiOptions.server = "https://siteDomain.com";
}

module.exports.home = function(req, res) {
    renderLoginPage(req, res);
};

/* Other routes / functions ... */

module.exports.logincontinue = function(req, res) {
    var path = '/api/authentication/login', sess;
    //var connectSid = res.req.cookies['connect.sid'];

    var requestOptions = {
        url : apiOptions.server + path,
        method : "POST",
        json : { email: req.body.username, password: req.body.password }/*,
        headers : { 'set-cookie':  connectSid }*/
    };

    request(requestOptions, function(err, response, body) {
        if(err) {
            renderPage(req, res, 'siteDomain.com', 'loginerror');
        } else if(response.statusCode === 200) {
            switch(body.showresume) {
                case true:
                    res.render('loginsuccessresume', {  title: 'siteDomain.com', page: 'loginsuccessresume', showresume: true });
                    break;
                default: 
                    renderPage(req, res, 'siteDomain.com', 'loginsuccess');
                    break;
            }
        } else if(response.statusCode === 401) {
            res.render('loginunauthorized', {  title: 'siteDomain.com', page: 'loginunauthorized', errormessage: body.message });
        } else {
            renderPage(req, res, 'siteDomain.com', 'loginerror');
        }
    });    
};

var renderPage = function(req, res, titleValue, pageValue) {
    res.render(pageValue, {  title: titleValue, page: pageValue });
};

var renderLoginPage = function(req, res) {
    res.render('index', { title: 'siteDomain.com', page: 'login' });
};

  1. As an update, this issue has been resolved.
  2. The issue was related to case-sensitivity with respect to the username field.
  3. Changing req.body.username to req.body.username.toLowerCase() resolved the issue within app_server/controllers/index.js and the function logincontinue .

Thank you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM