现在已经工作了几个小时,非常令人沮丧......
router.post('/',
passport.authenticate('local-signup', function(err, user, info) {
console.log(err);
}), function(req, res){
console.log(req);
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ a: 1 }));
});
当我运行它时,我使用console.log
,输出为{ message: 'Missing credentials' }
,这使我相信身体解析器没有正确解析正文消息。当我使用这条路线时......
router.post('/',
function(req, res){
console.log(req.body);
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ a: 1 }));
});
当我使用console.log
时,输出为{password: 'password', email: 'email@email.com'}
,表示req.body
变量设置正确且可用。
app.js
var express = require('express');
var app = express();
var routes = require("./config/routes.config");
var models = require("./config/models.config");
var session = require('express-session');
var bodyParser = require('body-parser');
models.forEach(function(model){
GLOBAL[model] = require('./models/'+model+".model");
});
var passport = require("./config/passport.config");
app.use( bodyParser.urlencoded({ extended: true }) );
app.use(session({ secret: 'simpleExpressMVC', resave: true, saveUninitialized: true }));
app.use(passport.initialize());
app.use(passport.session());
答案 0 :(得分:37)
我看到您的req.body
包含{password: 'password', email: 'email@email.com'}
。 email
不是护照正在寻找的,但username
是。{1}}。您可以在HTML / JS上更改输入名称,也可以在req.body
中更改passportjs正在查找的默认参数。您需要在定义策略的地方应用这些更改。
passport.use(new LocalStrategy({ // or whatever you want to use
usernameField: 'email', // define the parameter in req.body that passport can use as username and password
passwordField: 'password'
},
function(username, password, done) { // depending on your strategy, you might not need this function ...
// ...
}
));
答案 1 :(得分:3)
在Router.post中:
router.post('/', passport.authenticate('local-signup', {
successRedirect: '/dashboad',
failureRedirect: '/',
badRequestMessage: 'Your message you want to change.', //missing credentials
failureFlash: true
}, function(req, res, next) {
...
答案 2 :(得分:1)
字段类型可能存在错误,这就是为什么passport.js 无法识别正确字段并给出错误的原因。
更正:如果您的用户名和密码字段正确说明类型,请检查 .ejs 文件。
type="password" id="password" name="password"
//正确指定。
你可能做的是:Type:"text"
在 ejs 文件中并告诉护照寻找 type:"password"
提示:检查类型字段中的拼写错误。
例如:ejs 中的 type:password
和 type:Password
答案 3 :(得分:0)
就我而言,我只是想念usernameField
为usernameFiled
的拼写。
请确保您正确拼写usernameField
和passwordField
。
答案 4 :(得分:0)
我的拼写有误。
我有usernameFeild: 'email',
但是,它应该是usernameField: 'email',
答案 5 :(得分:0)
如果您将护照本地猫鼬用作用户模型的插件。
尝试一下:
passport.use(new LocalStrategy({
usernameField: 'email'
}, User.authenticate()));
答案 6 :(得分:0)
在我的情况下,将所有字段添加到config作品内:
passport.use(new LocalStrategy({
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true
}))
答案 7 :(得分:0)
在我自己的情况下,造成这种情况的原因是我的 body-parser 或 express 配置,我的应用程序没有收到来自表单的输入。所以我这样做了:
// configuring express
app.use(express.static(path.join(__dirname, "public")));
// body-parser
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
答案 8 :(得分:0)
我知道这里有很多答案,但这已经很清楚了。
来自官方护照文件
<块引用>"默认情况下,LocalStrategy 期望在参数中找到凭据 命名的用户名和密码。如果您的站点更喜欢命名这些字段 不同的是,可以使用选项来更改默认值。"
因此,如果您发现自己遇到此问题,则有两种解决方案(很可能)。
将前端中的 body 参数重命名为 username
和 password
使用以下代码为您的护照实例定义如何命名它们:
passport.use(new LocalStrategy({
usernameField: 'email', //can be 'email' or 'whateveryouwant'
passwordField: 'passwd' //same thing here
},
function(username, password, done) {
// ...
}
));