ExpressJS会话身份验证与Passport和Mongoose投掷EPERM重命名错误
最近我经历了多年的PHP / MySQL网络开发后才进入MEAN-stack / general Nodejs,我正在研究身份验证。我使用this guide创建一个使用Passport和json-server的简单身份验证服务器。它完全按照该指南中的描述工作。
但是,我想在我正在学习的项目中使用mongoose / MongoDB,所以我决定尝试修改该指南中的代码以便为mongoose工作。
一切似乎都很顺利(如果没有与ExpressJS服务器上的会话相匹配的cookie并且登录功能有效,则无法命中'/ authrequired'端点)但我尝试添加注册功能并且我收到重命名错误我从来没有见过,在这种情况下找不到太多信息。
从mongoose的观点来看,注册代码工作得很好但是当我尝试调用req.login()
时应该使用护照设置会话并重定向到'/ authrequired'(这是一个需要会话的守卫区域),我被踢回' /'(当'/ authrequired'无法验证用户身份时会发生这种情况)。
我得到的错误是:
错误:EPERM:不允许操作,重命名为'C:\ Users \ admin \ express-auth \ server \ sessions \ 39cad5de-5e1b-4319-b967-c77dd3ef729d.json.4139658133' - >'C:\ Users \ admin \ express -auth \服务器\会话\ 39cad5de-5e1b-4319-b967-c77dd3ef729d.json”
我不明白为什么express试图首先重命名会话文件。如果我查看sessions文件夹中有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(!bcryptpareSync(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('/')
}
});
回答如下:
我面临着类似的问题。我意识到我们俩都有两次会话。
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
}))
ExpressJS会话身份验证与Passport和Mongoose投掷EPERM重命名错误
最近我经历了多年的PHP / MySQL网络开发后才进入MEAN-stack / general Nodejs,我正在研究身份验证。我使用this guide创建一个使用Passport和json-server的简单身份验证服务器。它完全按照该指南中的描述工作。
但是,我想在我正在学习的项目中使用mongoose / MongoDB,所以我决定尝试修改该指南中的代码以便为mongoose工作。
一切似乎都很顺利(如果没有与ExpressJS服务器上的会话相匹配的cookie并且登录功能有效,则无法命中'/ authrequired'端点)但我尝试添加注册功能并且我收到重命名错误我从来没有见过,在这种情况下找不到太多信息。
从mongoose的观点来看,注册代码工作得很好但是当我尝试调用req.login()
时应该使用护照设置会话并重定向到'/ authrequired'(这是一个需要会话的守卫区域),我被踢回' /'(当'/ authrequired'无法验证用户身份时会发生这种情况)。
我得到的错误是:
错误:EPERM:不允许操作,重命名为'C:\ Users \ admin \ express-auth \ server \ sessions \ 39cad5de-5e1b-4319-b967-c77dd3ef729d.json.4139658133' - >'C:\ Users \ admin \ express -auth \服务器\会话\ 39cad5de-5e1b-4319-b967-c77dd3ef729d.json”
我不明白为什么express试图首先重命名会话文件。如果我查看sessions文件夹中有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(!bcryptpareSync(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('/')
}
});
回答如下:
我面临着类似的问题。我意识到我们俩都有两次会话。
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
}))