护照js缺少证件

时间:2015-12-29 12:24:40

标签: passport.js passport-local

现在已经工作了几个小时,非常令人沮丧......

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());

9 个答案:

答案 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:passwordtype:Password

答案 3 :(得分:0)

就我而言,我只是想念usernameFieldusernameFiled的拼写。

请确保您正确拼写usernameFieldpasswordField

答案 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)

我知道这里有很多答案,但这已经很清楚了。

来自官方护照文件

Passportjs documentation

<块引用>

"默认情况下,LocalStrategy 期望在参数中找到凭据 命名的用户名和密码。如果您的站点更喜欢命名这些字段 不同的是,可以使用选项来更改默认值。"

因此,如果您发现自己遇到此问题,则有两种解决方案(很可能)。

  1. 将前端中的 body 参数重命名为 usernamepassword

  2. 使用以下代码为您的护照实例定义如何命名它们:

    passport.use(new LocalStrategy({
        usernameField: 'email', //can be 'email' or 'whateveryouwant'
        passwordField: 'passwd' //same thing here
      },
      function(username, password, done) {
        // ...
      }
    ));