【问题标题】:passport authentication failed in basic example基本示例中的护照认证失败
【发布时间】:2013-06-09 02:08:40
【问题描述】:

我试图将这个 passport.js 示例分解为最基本的元素。我不断收到 401(未经授权)消息,但不知道为什么。任何帮助将不胜感激。

谢谢!

Node.js 文件:

var http = require('http'),
express = require('express'),
passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
flash = require('connect-flash');

var port = process.env.PORT || 8080;

passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});

passport.use(new LocalStrategy(
  function(username, password, done) {
   console.log("LocalStrategy working...");
   return done(null, { id: 1, username: 'Joe', password: 'schmo'});
  }
));

var app = express();

app.configure(function(){
  app.use(express.static(__dirname + '/app'));
  app.use(express.cookieParser('big secret'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieSession());
  app.use(flash());
  app.use(passport.initialize());
  app.use(passport.session());
  app.use(app.router);
});

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

app.post('/login', passport.authenticate('local'), function (req, res) {
  console.log("authenticated....");
  res.end();
});

app.listen(port);

【问题讨论】:

    标签: javascript node.js passport.js


    【解决方案1】:

    我认为现有答案没有明确解释问题是:如果缺少 req.body.usernamereq.body.password,Passport Local Strategy 将抱怨缺少凭据。

    通常的错误是POST数据没有被解析,可以使用body-parser修复。

    【讨论】:

      【解决方案2】:

      对于仍然收到此错误的任何人,请仔细检查您发送的字段确实是 usernamepassword。如果没有,您需要按照documentation 中的建议传递额外的参数。例如

      passport.use( new passportLocal({
        usernameField: 'email',
        passwordField: 'passwd'
      }, func..));
      

      【讨论】:

        【解决方案3】:

        所有使用新 express.js(4.x 及更高版本)以及 passport.js 的用户都可能会遇到“缺少凭据”的问题,因为默认情况下不解析 POST 数据。要修复它,请安装 body-parser npm install body-parser 并在您的代码中使用:

        var bodyParser = require( 'body-parser' );
        app.use( bodyParser.urlencoded({ extended: true }) );
        

        @ivarni 的好点子:app.use( bodyParser.urlencoded({ extended: true }) ); 必须在 注入任何护照中间件之前放置。

        【讨论】:

        • 绝对是这个。我想补充一点,在告诉 express 使用护照之前,需要先调用 app.use( bodyParser.urlencoded({ extended: true }) );
        【解决方案4】:

        您的 index.html 或登录页面是什么样的?在您的帖子中,您需要确保至少在正文中发送带有usernamepassword 字段的内容。如果您在没有这些内容的情况下发送帖子,您将收到 Missing credentials 错误消息。如果你想改变这些,你可以修改参数,如this guide所示。

        您可以自己检查这一点,方法是添加一个路由来捕获登录错误,并在调用passport.authenticate 时指定该路由。

        app.post('/login', 
          passport.authenticate('local', { failureRedirect: '/loginerror', failureFlash: true }),
          function(req, res) {
            res.redirect('/');
          });
        
        app.get('/loginerror') function(req,res) {
            console.log(req.flash('error'));
            res.redirect('/login');
        }
        

        我已修改您的示例以添加必要的表单。此外,如果有任何错误,则会在登录页面上呈现。例如,如果您只输入用户名而不是密码,您将看到“缺少凭据”错误消息。希望这会有所帮助!

        var http = require('http'),
            express = require('express'),
            passport = require('passport'),
            LocalStrategy = require('passport-local').Strategy,
            flash = require('connect-flash');
        
        var port = process.env.PORT || 8080;
        
        passport.serializeUser(function(user, done) {
            done(null, user);
        });
        
        passport.deserializeUser(function(obj, done) {
            done(null, obj);
        });
        
        passport.use(new LocalStrategy(
            function(username, password, done) {
                console.log("LocalStrategy working...");
                return done(null, { id: 1, username: 'Joe', password: 'schmo'});
            }
        ));
        
        var app = express();
        
        app.configure(function(){
            app.use(express.static(__dirname + '/app'));
            app.use(express.cookieParser('big secret'));
            app.use(express.bodyParser());
            app.use(express.methodOverride());
            app.use(express.cookieSession());
            app.use(flash());
            app.use(passport.initialize());
            app.use(passport.session());
            app.use(app.router);
        });
        
        app.get('/', function(req, res){
        
            var username = "not logged in";
        
            if (req.user) {
                username = req.user.username;
            }
        
            var body = '<html><body>';
            body = body + '<p>' + username + '</p>';
            body = body + '<a href="/login">login</a>'
            body = body + '</body></html>'
        
            res.send(body);
        });
        
        app.get('/login', function(req, res){
        
            var message = req.flash('error');
            var body = '<div><p>' + message + '</p></div>';
            body = body + '<form action="/login" method="post">';
            body = body + '<div><label>Username:</label>';
            body = body + '<input type="text" name="username"/><br/></div>';
            body = body + '<div><label>Password:</label>';
            body = body + '<input type="password" name="password"/></div>';
            body = body + '<div><input type="submit" value="Submit"/></div></form>';
            res.send(body);
        });
        
        app.post('/login', 
            passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }),
            function(req, res) {
                res.redirect('/');
        });
        
        app.listen(port);
        

        【讨论】:

        • 确实,它必须被称为username。我只使用name,反映了我自己的数据模式,这导致每次登录都失败。谢谢,+1。
        • 我在处理用户登录的 ejs 模板中有错字。用户名未在帖子中发送。
        • @ArcaneEngineer,这是为我做的......!谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 1970-01-01
        • 2013-05-27
        • 2022-09-26
        • 2022-11-28
        • 1970-01-01
        相关资源
        最近更新 更多