Я только начинаю изучать 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('/')
}
});