Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Passport local返回错误400错误请求_Javascript_Angularjs_Express_Passport.js_Passport Local - Fatal编程技术网

Javascript Passport local返回错误400错误请求

Javascript Passport local返回错误400错误请求,javascript,angularjs,express,passport.js,passport-local,Javascript,Angularjs,Express,Passport.js,Passport Local,我正在尝试将passport集成到我的代码的登录表单中。在我调用passport.authenticate之前,客户端调用服务器端的工作正常。在请求中,返回了400个错误请求。我错过了什么 HTML server.js passport.use(new LocalStrategy( function(username, password, done) { return done(null, false, {message:'Unable to login'}) }

我正在尝试将passport集成到我的代码的登录表单中。在我调用passport.authenticate之前,客户端调用服务器端的工作正常。在请求中,返回了400个错误请求。我错过了什么

HTML

server.js

passport.use(new LocalStrategy(
    function(username, password, done) {
        return done(null, false, {message:'Unable to login'})
    }
));
passport.serializeUser(function(user,done){
    done(null,user);
});

passport.deserializeUser(function(user,done){
    done(null,user);
});
app.post('/api/login', passport.authenticate('local'), function(req,res){
    res.json(req.user)
});

passport由于缺少用户名和密码的访问权限而引发了错误请求

它正在检查字段
username
password
的正文和URL查询。如果其中一个为falsy,则请求将被拒绝,状态为400

在创建LocalStrategy时,您可以将附加参数中的一组选项传递给使用选项
usernameField
和/或
passwordField
选择不同名称字段的构造函数。在您的特定情况下,这将如下所示:

passport.use(new LocalStrategy(
    {usernameField:"user-email", passwordField:"user-password"},
    function(username, password, done) {
        return done(null, false, {message:'Unable to login'})
    }
));

在我的例子(Express 4.0)中,我没有使用

此错误还来自尝试在不使用主体解析器的情况下访问请求负载

使用-


很抱歉迟了答复。是的,你是对的。谢谢options对象应该是LocalStrategy构造函数中的第一个参数,而不是passport中的第二个参数。请使用方法。@Fkids谢谢您的建议。修好了,帮个大忙!谢谢你,请尝试更清楚地解释为什么这是问题的答案。默认情况下,LocalStrategy在从请求进行身份验证时使用用户名和密码,但我们需要的是电子邮件和密码。要做到这一点,我们需要{usernameField:'email',passwordField:'password'}类似地,我有我的
应用程序。请使用(express.json());
my/login之后设置的json正文解析器
passport.use(new LocalStrategy(
    function(username, password, done) {
        return done(null, false, {message:'Unable to login'})
    }
));
passport.serializeUser(function(user,done){
    done(null,user);
});

passport.deserializeUser(function(user,done){
    done(null,user);
});
app.post('/api/login', passport.authenticate('local'), function(req,res){
    res.json(req.user)
});
passport.use(new LocalStrategy(
    {usernameField:"user-email", passwordField:"user-password"},
    function(username, password, done) {
        return done(null, false, {message:'Unable to login'})
    }
));
var parser = require('body-parser');
var urlencodedParser = parser.urlencoded({extended : false});


    app.post("/authenticate", urlencodedParser, passport.authenticate('local'), function (request, response)
    {           
        response.redirect('/');                      
    });
passport.use(new LocalStrategy(
    {
        usernameField: 'email',
        passwordField: 'password'
    },
    function (email, password, done) {
        db.collection('User').findOne({ email: email }, async function (err, user) {
            console.log('user requested password caught in passport', password);
            if (err) { return done(err); }
            if (!user) { return done(null, false); }
            const matchPassword = await comparePassword(password, user.password);
            if (!matchPassword) { return done(null, false); }
            return done(null, user);
        });
    }
));