如何在 signup/register 中使用 passport.js 和快速服务器保存用户数据
How to save user data in signup/register using passport.js with express server
我正在努力在我的 react/node/express/sequelize 应用程序中实现 passport.js。
我目前有中间件用于登录用户,并检查用户是否已通过身份验证。但是,当新用户注册或注册时,他们的用户数据不会保存到服务器会话中(即使它是在数据库中创建的)。这意味着用户注册后,他们必须转到登录页面,输入他们的凭据并点击登录,然后才能保存他们的会话。
我的登录功能很简单:
router.post('/login', passport.authenticate('local'), (req, res) => {
//console.log(req);
console.log("Is authenticated: " + req.isAuthenticated());
res.json(req.user);
});
它使用 passport.authenticate 本地策略,我将其定义为:
passport.use(new LocalStrategy(
{
usernameField: 'email',
},
((email, password, done) => {
User.findOne({
where: {
email,
},
}).then((dbUser) => {
if (!dbUser) {
return done(null, false, {
message: 'Incorrect email.',
});
}
if (!dbUser.validPassword(password)) {
return done(null, false, {
message: 'Incorrect password.',
});
}
return done(null, dbUser);
});
}),
));
我从护照文档和查看其他问题得知 passport.authenticate 本地策略自动调用 req.login() 函数,该函数序列化我的用户信息并将其保存在服务器会话中.
我的主要问题是我不确定如何在我的注册函数中实现它。
router.post('/signup', (req, res) => {
const user = {
first_name: req.body.first_name,
last_name: req.body.last_name,
email: req.body.email,
password: req.body.password,
};
User.findOrCreate({where: {email: user.email}, defaults: user})
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the User."
});
});
});
我试过在 findOrCreate 之后调用 req.login(),但出现错误:
(node:42313) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
如果我使用我的本地策略,我会收到未经授权的响应(因为我用于授权的凭据尚未在数据库中)。
我想我需要为登录制定一个自定义策略,但我不清楚这是否是正确的方法,或者我将如何指定它。
我通过在 res.send 之前添加 req.login 来修复此问题:
router.post('/signup', (req, res) => {
const user = {
first_name: req.body.first_name,
last_name: req.body.last_name,
email: req.body.email,
password: req.body.password,
};
User.findOrCreate({where: {email: user.email}, defaults: user})
.then(data => {
req.login(data[0], function(err) {
if (err) {
console.log("login function erroring out with: " + err)
}
});
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the User."
});
});
});
我正在努力在我的 react/node/express/sequelize 应用程序中实现 passport.js。
我目前有中间件用于登录用户,并检查用户是否已通过身份验证。但是,当新用户注册或注册时,他们的用户数据不会保存到服务器会话中(即使它是在数据库中创建的)。这意味着用户注册后,他们必须转到登录页面,输入他们的凭据并点击登录,然后才能保存他们的会话。
我的登录功能很简单:
router.post('/login', passport.authenticate('local'), (req, res) => {
//console.log(req);
console.log("Is authenticated: " + req.isAuthenticated());
res.json(req.user);
});
它使用 passport.authenticate 本地策略,我将其定义为:
passport.use(new LocalStrategy(
{
usernameField: 'email',
},
((email, password, done) => {
User.findOne({
where: {
email,
},
}).then((dbUser) => {
if (!dbUser) {
return done(null, false, {
message: 'Incorrect email.',
});
}
if (!dbUser.validPassword(password)) {
return done(null, false, {
message: 'Incorrect password.',
});
}
return done(null, dbUser);
});
}),
));
我从护照文档和查看其他问题得知 passport.authenticate 本地策略自动调用 req.login() 函数,该函数序列化我的用户信息并将其保存在服务器会话中.
我的主要问题是我不确定如何在我的注册函数中实现它。
router.post('/signup', (req, res) => {
const user = {
first_name: req.body.first_name,
last_name: req.body.last_name,
email: req.body.email,
password: req.body.password,
};
User.findOrCreate({where: {email: user.email}, defaults: user})
.then(data => {
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the User."
});
});
});
我试过在 findOrCreate 之后调用 req.login(),但出现错误:
(node:42313) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
如果我使用我的本地策略,我会收到未经授权的响应(因为我用于授权的凭据尚未在数据库中)。
我想我需要为登录制定一个自定义策略,但我不清楚这是否是正确的方法,或者我将如何指定它。
我通过在 res.send 之前添加 req.login 来修复此问题:
router.post('/signup', (req, res) => {
const user = {
first_name: req.body.first_name,
last_name: req.body.last_name,
email: req.body.email,
password: req.body.password,
};
User.findOrCreate({where: {email: user.email}, defaults: user})
.then(data => {
req.login(data[0], function(err) {
if (err) {
console.log("login function erroring out with: " + err)
}
});
res.send(data);
})
.catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while creating the User."
});
});
});