Node JS Express, паспорт JS и Android Проблемы с аутентификацией устройства - PullRequest
0 голосов
/ 19 июня 2020
  1. В настоящее время я реализую страницу входа через Node JS Express и Passport с использованием локальной стратегии Passport : http://www.passportjs.org/packages/passport-local/.
  2. база данных использует MongoDB.
  3. Возникающая проблема заключается в том, что мне не удается успешно войти в систему (иногда я могу, но это не всегда) на телефоне android и планшете android с пользователем A .
  4. Возвращается ответ 401 (несанкционированная ошибка).
  5. Я подтвердил, что могу успешно войти в систему с пользователем A с настольного компьютера, а также подтвердил, что могу войти на iOS устройства (iPhone и iPad).

Есть ли у кого-нибудь предложения и / или знает, в чем проблема?

Ниже приведен код, который выполняет аутентификацию

app_api / config / паспорт. 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('/');
};

Ниже контроллер app_server / controllers / index. js и функция logincontinue , которая вызывает файл app_api / controllers / authentication. js и его функцию 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 Ответ

0 голосов
/ 19 июня 2020
  1. В обновлении эта проблема была решена.
  2. Проблема была связана с чувствительностью к регистру в поле имени пользователя.
  3. Изменение req.body.username на req.body.username.toLowerCase () разрешило проблему в app_server / controllers / index. js и функции logincontinue .

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...