gpt4 book ai didi

javascript - Passport.js:LocalStrategy 如何访问用户信息?

转载 作者:行者123 更新时间:2023-12-01 15:28:10 25 4
gpt4 key购买 nike

我已经阅读了几篇文章,解释了 Passport 身份验证的流程并理解了大部分概念。但是,仍有一些模糊的地方需要解释,以便我可以一劳永逸地了解 Passport。
让我们看看这个实现 的简单示例用户注册 :

passport.js


passport.use(
'register',
new LocalStrategy(
{
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true,
session: false,
},
(req, username, password, done) => {
// TODO:Why is req.body.email is used and not req.body.username
// And how are these values passed to register in the first place?
console.log(username);
console.log(req.body.email);

try {
User.findOne({
where: {
[Op.or]: [
{
username,
},
{ email: req.body.email },
],
},
}).then(user => {
if (user != null) {
console.log('username or email already taken');
return done(null, false, {
message: 'username or email already taken',
});
}
/**
* on register the user’s password is hashed and salted with the encryption package bcrypt
*
*/
bcrypt.hash(password, BCRYPT_SALT_ROUNDS).then(hashedPassword => {
User.create({
username,
password: hashedPassword,
email: req.body.email,
}).then(user => {
console.log('user created');
return done(null, user);
});
});
});
} catch (err) {
//In case of an Error interacting with our database, we need to invoke done(err)
//Calling done will make the flow jump back into passport.authenticate.
//It's passed the error, user and additional info object (if defined).
return done(err);
}
},
),
);

registerUser.js:


app.post('/registerUser', (req, res, next) => {
//Calling done will make the flow jump back into passport.authenticate.
//It's passed the error, user and additional info object (if defined).

passport.authenticate('register', (err, user, info) => {
if (err) {
console.error(err);
}
if (info !== undefined) {
console.error(info.message);
res.status(403).send(info.message);
} else {
// eslint-disable-next-line no-unused-vars
req.logIn(user, error => {
console.log(user);
const data = {
first_name: req.body.first_name,
last_name: req.body.last_name,
email: req.body.email,
username: user.username,
};
console.log(data);
User.findOne({
where: {
username: data.username,
},
}).then(user => {
console.log(user);
user
.update({
first_name: data.first_name,
last_name: data.last_name,
email: data.email,
})
.then(() => {
console.log('user created in db');
res.status(200).send({ message: 'user created' });
});
});
});
}
})(req, res, next);
});

问题一:我看不到 里面的代码如何本地策略 知道 可以访问用户信息Passport.authenticate 已以这种方式调用:
    app.post('/registerUser', (req, res, next) => {
passport.authenticate('register', (err, user, info) => {

那么 **regiser LocalStrategy ** 中的代码如何访问用户名、电子邮件和密码:
(req, username, password, done) => {
console.log(username);
console.log(req.body.email);

问题2:怎么会 用户名 里面 本地策略 被称为 用户名 直接(密码相同)和电子邮件由 调用req.body.email ?
 console.log(username);
console.log(req.body.email);

和这里:
User.create({
username,
password: hashedPassword,
email: req.body.email,
})

问题3:为什么需要更新 中的用户信息请求回调 如果用户已经在 中创建注册 LocalStrategy :

registerUser.js


  .update({
first_name: data.first_name,
last_name: data.last_name,
email: data.email,
})

passport.js


User.create({
username,
password: hashedPassword,
email: req.body.email,
})

编辑 1
问题4: 的作用是什么(请求,资源,下一个); 的末尾发布 打回来?

最佳答案

对于问题1:当您调用passport.authenticate('register')时你应该通过 req , res , 然后 next 结束,这样 passport.use(localStrategy)获取用户信息。

对于问题 2,用户名来自 req localstrategy 内的对象

对于问题3:您不需要更新用户信息。您可以直接将资源发送给.then()中的用户。像你一样工作:

then(() => {
console.log('user created in db');
res.status(200).send({
message: 'user created'
});
});

关于javascript - Passport.js:LocalStrategy 如何访问用户信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59953971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com