Quiero usar el correo electrónico y la contraseña del usuario para iniciar sesión. Pero en el pasaporte debe usar el nombre de usuario.
He probado muchos ejemplos sobre cómo hacer eso. Pero no trabajado. El verdadero problema es cuando la aplicación quiere guardar el registro en la base de datos. Aunque he cambiado el código para buscar el campo de correo electrónico y no de nombre de usuario, este es el último registro guardado en la base de datos:
'name': 'joseph', 'username' : 'example@gmail.com', . .Pero no quiero que el correo electrónico se guarde como nombre de usuario. Y cuando lo cambio con mongoose después del registro del usuario, sería correcto, pero nuevamente el problema vendrá cuando la aplicación quiera autenticar al usuario.
Buscará el campo de nombre de usuario en la base de datos, no en el correo electrónico. Debido a que el usuario proporcionará un correo electrónico como nombre de usuario, el inicio de sesión fallará.
Código:
app.get("/register", function(req, res) { var newUser = new User({ username : req.body.username, email : req.body.email, name: req.body.name }); User.register(newUser, req.body.password, function(err, user) { if (err) { req.flash('error', "An error ocurred, please try again."); return res.redirect('back'); } else { passport.authenticate("local")(req, res, function() { req.flash("success", "Welcome"); res.redirect("/admin"); }); } }); });Este código registra al usuario de la manera que quiero, pero el problema es sobre el inicio de sesión:
router.post('/login', middleware.outLoggedIn, passport.authenticate("local", { successRedirect: "/admin", failureRedirect: "/login", failureFlash: "Invalid username or password", successFlash: "Welcome!" }));Siempre falla, porque obtendrá el correo electrónico del usuario proporcionado en el formulario de inicio de sesión, luego lo comparará con el de la base de datos. Y dado que guardé al usuario con el correo electrónico y el nombre de usuario, comparará el correo electrónico proporcionado en el formulario de inicio de sesión con el campo de nombre de usuario en la base de datos. Y FRACASO.
Este es el usuario en la base de datos:
{ "_id" : ObjectId("5901cc5c0256ed17b4d61960"), "salt" : "---", "hash" : "---", "username" : "joseph320", "email" : "example@gmail.com", "name" : "joseph", "__v" : 0 }(El formulario de inicio de sesión requiere correo electrónico y contraseña)
También he hecho esto:
passport.use(new localStrategy({ usernameField: 'email' }, User.authenticate()));Realmente aprecio si me puede mostrar cómo arreglar eso.
¿Puede proporcionar más de su código? Aquí es importante algo de contexto, como qué módulos npm está utilizando para leer y escribir en su base de datos.
** Si está utilizando passport-local-mongoose
Dijiste que estás usando mangosta, y parece que podrías estar usando passport-local-mongoose además de eso. Si este es el caso, puede ver las opciones para passport-local-mongoose . Esto también incluye una opción de campo de nombre de usernameField , que indica dónde desea que se almacene el "nombre de usuario". El uso para eso se vería así:
User.plugin(passportLocalMongoose, {usernameField: 'email'})