gpt4 book ai didi

node.js - Passport 本地身份验证加上 Passport Mongoose 本地不接受电子邮件作为用户名

转载 作者:太空宇宙 更新时间:2023-11-04 01:48:28 27 4
gpt4 key购买 nike

我正在使用 Passport 本地策略和 Passport Mongoose 本地来创建用户并检查用户身份验证。但是,我想探索使用电子邮件而不是用户名的选项。我按照文件的规定进行操作,但我未经授权。有人可以告诉我为什么会出现错误,如果我只使用用户名作为登录,它就会起作用。

来自 Passport 本地 Mongoose 注意:usernameField:指定保存用户名的字段名称。默认为“用户名”。如果您想使用不同的字段来保存用户名(例如“电子邮件”),则可以使用此选项。

以及 Passport 本地策略默认情况下,LocalStrategy 希望在名为用户名和密码的参数中查找凭据。如果您的网站希望以不同的方式命名这些字段,可以使用选项来更改默认值。

我试图同时将两者设置为 true,并且我也尝试将一个设置为 true,另一个设置为 off。我会得到同样的错误

express 4.16.0快速 session 1.15.6 Mongoose 5.1.2 Passport 0.40 Passport 本地 1.0.0 Passport 本地 Mongoose 5.0.0

Passport .js

module.exports = function (passport, LocalStrategy, User) {
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true,
session: true
},
function(req, username, password, done) {
return done(null, req.user);
}
));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
};

模型/User.js

var UserSchema = new mongoose.Schema({
name: { type: String, required: true, default: ''},
username: { type: String, unique: true, uniqueCaseInsensitive: true, required: true, default: ''},
email: { type: String, required: true, unique: true, uniqueCaseInsensitive: true, default: ''},
profileImage:{ type: String, default: ''},
timestamp: {type: String, default: () => moment().format("dddd, MMMM Do YYYY, h:mm:ss a") }
});

UserSchema.plugin(passportLocalMongoose, {usernameField: 'email'});
UserSchema.plugin(uniqueValidator);

module.exports = mongoose.model('UserSchema', UserSchema);

signinForm.js

<form class="form-signin" action="/users/signup" method="POST" enctype='multipart/form-data'>
<h1 class="h3 mb-3 font-weight-normal">Please sign up</h1>
<label for="inputName" class="sr-only">Name</label>
<input type="bane" id="inputName" class="form-control" placeholder="Name" name='name' required autofocus />

<label for="inputUsername" class="sr-only">Username</label>
<input type="bane" id="inputUsername" class="form-control" placeholder="Username" name='username' required autofocus />

<label for="inputEmail" class="sr-only">Email</label>
<input type="email" id="inputEmail" class="form-control" placeholder="Email" name='email' required autofocus />

<label for="inputPassword" class="sr-only">Password</label>
<input type="password" id="inputPassword" class="form-control" placeholder="Password" name='password' required autofocus/>

<label for="inputConfirmPassword" class="sr-only">Confirm Password</label>
<input type="password" id="inputConfirmPassword" class="form-control" placeholder="Confirm Password" name='confirmPassword' required autofocus/>

<input type='file' class='form-control' id='inputFile' name='profileImage' />
<div style="height: 10px"></div>
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
<p class="mt-5 mb-3 text-muted">&copy; 2017-2018</p>
</form>

路由/user.js

router.post('/signup', upload.single('profileImage'), function(req, res, next) {

const name = req.body.name;
const email = req.body.email;
const password = req.body.password;
const confirmPassword = req.body.confirmPassword;

if (req.file) {
console.log('Uploading File...');
var profileImage = req.file.filename;
} else {
console.log('No File Uploaded... Setting to no image');
var profileImage = 'noimage.jpg';
}

UserController.createUser(req.body, function(err, user) {
if (err) {
res.json({
err: err
});
return;
}
passport.authenticate('local')(req, res, function() {
//res.render('index', {currentUser: user, title: 'Product Page' });
res.redirect('/');
return;
});
return;
})
});

我最终获得了授权并收到了 401

提前致谢。

enter image description here enter image description here

最佳答案

尝试去掉UserController.createUser()最后的return,需要等待passport.authenticate()的结果

关于node.js - Passport 本地身份验证加上 Passport Mongoose 本地不接受电子邮件作为用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50568244/

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