Аутентификация сеанса ExpressJS с паспортом и ошибка переименования EPERM с использованием Mongoose Throwing - PullRequest
0 голосов
/ 20 сентября 2018

Я только начинаю изучать MEAN-стек / общие вопросы Nodejs недавно после нескольких лет веб-разработки на PHP / MySQL, и я смотрю на аутентификацию.Я использовал это руководство , чтобы создать простой сервер аутентификации с Passport и json-сервером.Он работает точно так, как описано в этом руководстве.

Однако я хочу использовать mongoose / MongoDB для проекта, с которым я учусь, поэтому я решил попробовать изменить код в этом руководстве, чтобы он работал на mongoose.

Казалось, что все идет хорошо (конечная точка '/ authrequired' не может быть запущена без файла cookie, соответствующего сеансу на сервере ExpressJS, и работает функция входа в систему), но я попытался добавить функцию регистрации, и я 'получаю ошибку переименования, которую я никогда раньше не видел и не могу найти много информации в этом контексте.

Регистрационный код работает нормально с точки зрения mongoose, но когда я пытаюсь позвонить req.login()который должен установить сеанс с использованием паспорта и перенаправить на «/ authrequired» (который является защищенной областью, требующей сеанса), я получаю ответный удар к «/» (что происходит, когда «/ authrequired» не может аутентифицировать пользователя).

Полученная ошибка:

Ошибка: EPERM: операция не разрешена, переименуйте 'C: \ Users \ admin \ express-auth \ server \ session \ 39cad5de-5e1b-4319-b967-c77dd3ef729d.json.4139658133 '->' C: \ Users \ admin \ express-auth \ server \ session \ 39cad5de-5e1b-4319-b967-c77dd3ef729d.json '

Я не понимаю, почему Express пытается переименовать файл сессии в первую очередь.Если я посмотрю в папке сессий, есть 2 файла:

  • 39cad5de-5e1b-4319-b967-c77dd3ef729d.json
  • 39cad5de-5e1b-4319-b967-c77dd3ef729d.json.4139658133

Первый содержит данные сеанса json, второй пустой.

Кто-нибудь знает, что происходит?Что я сделал не так и что я могу сделать, чтобы решить эту проблему?

Я не получал эту ошибку переименования при использовании версии json-server / axios, описанной в связанном руководстве.

Спасибо

Конфигурация паспорта

passport.use(new LocalStrategy(
  { usernameField: 'email' },
  (email, password, done) => {
    User.findOne({email: email}, (err, user) => {
      if(!user) {
        return done(null, false, { message: 'Invalid credentials.\n' });
      }
      if(!bcrypt.compareSync(password, user.password)) {
        return done(null, false, { message: 'Invalid credentials.\n' });
      }
      return done(null, user);
    });
  }
});

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

passport.deserializeUser((id, done) => {
  User.findById(id, (err, user) => {
    if(user) {
      done(null, user);
    }
    else if(err) {
      done(error, false);
    }
  });
});

настройка приложения

// create the server
const app = express();

// add & configure middleware
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(session({
  genid: (req) => {
    return uuid() // use UUIDs for session IDs
  },
  store: new FileStore(),
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))
app.use(passport.initialize());
app.use(passport.session());

Регистрация конечной точки

app.post('/register', (req, res, next) => { 
  User.findOne({email: req.body.email}, (err, user) => {
    if(user) {
      res.send('Account with email already exists.');
    } else {
      console.log(req.body.password);
      bcrypt.hash(req.body.password, null, null, (err, hash) => {
        if(err) { return next(err); }
        var newUser = new User({
          username: req.body.username,
          email: req.body.email,
          password: hash,
          passwordConf: hash
        });
        newUser.save((err, savedUser) => {
          console.log(savedUser);
          if(err) {
            return res.send('error saving user.');
          }
          else {
            req.login(savedUser, (err) => {
              if(err) { return next(err); }
              return res.redirect('/authrequired');
            });
          }
        });
      });
    }
  });
});

Конечная точка входа в систему

    app.post('/login', (req, res, next) => {
  passport.authenticate('local', (err, user, info) => {
    if(info) {return res.send(info.message)}
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.login(user, (err) => {
      if (err) { return next(err); }
      return res.redirect('/authrequired');
    });
  })(req, res, next);
});

Требуемая конечная точка

app.get('/authrequired', (req, res) => {
  if(req.isAuthenticated()) {
    res.send('you hit the authentication endpoint\n')
  } else {
    res.redirect('/')
  }
});

1 Ответ

0 голосов
/ 16 февраля 2019

Я столкнулся с подобной проблемой.Я понял, что у нас обоих сессия была объявлена ​​дважды.

app.use(session({
  genid: (req) => {
    return uuid() // use UUIDs for session IDs
  },
  store: new FileStore(),
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))
app.use(passport.initialize());
app.use(passport.session());

Ошибка исчезла, когда я удалил первое объявление сеанса.

app.use(session({
  genid: (req) => {
    return uuid() // use UUIDs for session IDs
  },
  store: new FileStore(),
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
}))
...