javascript - 允许用户使用 Passport、LocalStrategy 使用电子邮件或用户名登录

标签 javascript node.js authentication passport.js

我对 Web 开发比较陌生,我正在使用 NodeJs 和 Express 创建一个网站,在注册时会要求提供用户名和电子邮件。目前,它只接受用户名登录。我正在使用 Passport 和 LocalStrategy。我希望用户能够在同一输入字段中提供用户名或电子邮件,我该怎么做?我在互联网上搜索并发现了类似的问题,但我无法成功地实现他们的答案。这是我的 app.js 的相关部分

var express    = require("express"),
    mongoose   = require("mongoose"),
    passport = require("passport"),
    LocalStrategy = require("passport-local"),
    User = require("./models/user");

// PASSPORT CONFIGURATION
app.use(require("express-session")({
    secret: "Once again Rusty wins cutest dog!",
    resave: false,
    saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

// Register
app.get("/register", function(req, res) {
    res.render("register");
});
app.post("/register", function(req, res){
    var newUser = new User({email: req.body.email, username: req.body.username});
    console.log(newUser);
    User.register(newUser, req.body.password, function(err, user){
        if(err) {
            console.log(err);
            return res.render("register");
        }
        passport.authenticate("local")(req, res, function(){
           res.redirect("/");
        });
    });
});

// Login
app.get("/login" , function(req, res) {
    res.render("login");
});
app.post("/login", passport.authenticate("local", 
    {
        successRedirect: "/campgrounds",
        failureRedirect: "/login"
    }), function(req, res) {
});

这是我的用户模型

var mongoose = require("mongoose");
var passportLocalMongoose = require("passport-local-mongoose");

var UserSchema = new mongoose.Schema({
    email: String,
    username: String,
    password: String
});

UserSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model("User", UserSchema);

谢谢!

最佳答案

我深入研究了 Passport Local Mongoose 的文档,并找到了一种方法来做到这一点。我会将答案留在这里,以防有人发现它有用。当对用户模型进行插件时,可以指定选项:

User.plugin(passportLocalMongoose, options);

使用 usernameQueryFields 选项,可以提供其他字段来查找用户名(例如电子邮件)。所以我像这样更改了 user.js:

UserSchema.plugin(passportLocalMongoose, {usernameQueryFields: ["email"]});

现在用户可以在登录表单中提供电子邮件或用户名

关于javascript - 允许用户使用 Passport、LocalStrategy 使用电子邮件或用户名登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49581919/

相关文章:

file - Node : Search for a filetype in a folder

node.js jade - 如何在 jade 中设置内容类型

bash - 如何在 gnome 中记录我的登录/注销和屏幕锁定/解锁

c# - RestSharp - 从 POSTed 响应中检索授权 token

java - 胖客户端和服务器之间的 session 管理?

javascript - 用 undefined 覆盖 JavaScript 默认参数

javascript - 使用 htmlwidgets::scaffoldWidget 将外部 js 库合并为一个新包以进入 Shiny 的应用程序

JavaScript 函数作用域行为

javascript - 返回按钮/bfcache : Object hidden in DOM via jquery is visible again when going back?

javascript - 服务器触发客户端事件两次