Как сделать логин постоянным в узле Passportjs? - PullRequest
0 голосов
/ 06 июля 2018

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

Я что-то упускаю, чтобы логин пользователя был постоянным?

Вот мой код ниже:

Passport.js

// load all the things we need
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var TwitterStrategy = require('passport-twitter').Strategy;

// include the user model
var User = require('../app/model/user');

// include the auth credentials
var configAuth = require('./auth');


require('../app/model/upload');

module.exports = function(passport) {

  // used to serialize the user for the session
  passport.serializeUser(function(user, done) {
    done(null, user.id);
  });

  // used to deserialize the user
  passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
      done(err, user);
    });
  });

  // code for login (use('local-login', new LocalStategy))
  // code for signup (use('local-signup', new LocalStategy))
  // code for facebook (use('facebook', new FacebookStrategy))

  // =========================================================================
  // TWITTER =================================================================
  // =========================================================================
  passport.use(new TwitterStrategy({

      consumerKey: configAuth.twitterAuth.consumerKey,
      consumerSecret: configAuth.twitterAuth.consumerSecret,
      callbackURL: configAuth.twitterAuth.callbackURL,
      userProfileURL: "https://api.twitter.com/1.1/account/verify_credentials.json?include_email=true",
      includeEmail: true,
      profileFields: ['emails']


    },

    function(token, tokenSecret, profile, done) {

      // make the code asynchronous
      // User.findOne won't fire until we have all our data back from Twitter
      process.nextTick(function() {

        User.findOne({
          'member.id': profile.id
        }, function(err, user) {

          // if there is an error, stop everything and return that
          // ie an error connecting to the database
          if (err)
            return done(err);

          // if the user is found then log them in
          if (user) {
            return done(null, user); // user found, return that user
          } else {

            //declare emails as an array

            //var emails = []; 
            // if there is no user, create them
            var newUser = new User();

            newUser.member.id = profile.id;
            newUser.member.token = profile.token;
            newUser.member.username = profile.username;
            newUser.member.displayName = profile.displayName;
            newUser.member.email = profile.emails[0].value;
            newUser.member.medium = 'Twitter';
            newUser.member.picture = profile._json.profile_image_url.replace('_original', '');
            // save  user credentials into the database
            newUser.save(function(err) {
              if (err)
                throw err;
              return done(null, newUser);

              // res.cookie('username', newUser.twitter.username).send('Hello'); 
            });
          }

        });

      });

    }));

};

В некоторых руководствах сказано, что я должен использовать сеанс паспорта, который я использовал, но ничего не изменилось:

Server.js
//read cookies (needed for auth)
app.use(cookieParser());

// get information from html forms
app.use(bodyParser()); 

//persistent login
app.use(session({ secret: 'keyboard cat' }));

app.use(passport.initialize());

// persistent login sessions
app.use(passport.session()); 

1 Ответ

0 голосов
/ 06 июля 2018

Здесь есть две разные вещи.

Если пользователь выходит из системы после перезапуска сервера, вам нужен «магазин».

Если пользователь автоматически регистрируется через некоторое время, даже если вы не перезагружали сервер, вам необходимо установить дату окончания сеанса или файла cookie.

Вы можете использовать промежуточное программное обеспечение connect:
http://www.senchalabs.org/connect/session.html
.use(connect.session({ secret: 'SUPER SECRET', cookie: { maxAge: 86400000 }}))

Это должно сохранить сессию действительной в течение 24 часов (укажите здесь свой номер)

ИЛИ Промежуточное ПО express-session: https://github.com/expressjs/session

Оба имеют концепцию store. В двух словах, он указывает, где будут храниться детали. Если он находится в памяти (не рекомендуется), вы потеряете сеансы после перезапуска сервера.

...