Javascript 基本示例中的passport身份验证失败

Javascript 基本示例中的passport身份验证失败,javascript,node.js,passport.js,Javascript,Node.js,Passport.js,我试图将这个passport.js示例分解为最基本的元素。我一直收到一条401(未经授权)的消息,不知道为什么。任何帮助都将不胜感激 谢谢大家! Node.js文件: var http = require('http'), express = require('express'), passport = require('passport'), LocalStrategy = require('passport-local').Strategy, flash = require('connect

我试图将这个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);

您的index.html或登录页面是什么样子的?在你的帖子中,你需要确保你在正文中至少发送了带有
用户名
密码
字段的内容。如果您发送的帖子中没有这些内容,则会收到
缺少凭据的错误消息。如果要更改这些参数,可以修改参数,如所示

您可以通过添加一个路由来捕获登录错误,并在调用
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);
var http=require('http'),
express=require('express'),
passport=require('passport'),
LocalStrategy=require('passport-local')。策略,
闪存=需要(“连接闪存”);
var port=process.env.port | | 8080;
passport.user(函数(user,done){
完成(空,用户);
});
passport.deserializeUser(函数(obj,done){
完成(空,obj);
});
passport.use(新本地策略)(
函数(用户名、密码、完成){
log(“本地策略工作…”);
返回完成(null,{id:1,用户名:'Joe',密码:'schmo'});
}
));
var-app=express();
app.configure(函数(){
app.use(express.static(uu dirname+/app');
app.use(express.cookieParser(‘大秘密’);
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieSession());
应用程序使用(flash());
app.use(passport.initialize());
app.use(passport.session());
应用程序使用(应用程序路由器);
});
app.get('/',函数(req,res){
var username=“未登录”;
如果(请求用户){
用户名=req.user.username;
}
变量体=“”;
body=body+''+username+'

'; body=body+“” body=body+“” 决议(正文); }); app.get('/login',函数(req,res){ var消息=请求闪存(“错误”); 变量主体=''+消息+'

'; 身体=身体+“”; body=body+“用户名:”; body=body+'
'; body=body+“密码:”; 身体=身体+“”; 身体=身体+“”; 决议(正文); }); app.post(“/login”, authenticate('local',{failureRedirect:'/login',failureFlash:true}), 功能(req、res){ res.redirect('/'); }); app.listen(端口);
new express.js(4.x及更高版本)和passport.js的所有用户都可能会遇到“缺少凭据”的问题,因为默认情况下不会解析POST数据。要修复此问题,请安装body parser
npm安装body parser
并在代码中使用:

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

@ivarni:
app.use(bodyParser.urlencoded({extended:true}))的观点很好置于位置。

对于仍收到此错误的任何人,请仔细检查您发送的字段是否确实是
用户名
&
密码
。如果没有,则需要按照中的建议传入额外的参数。例如

passport.使用(新passportLocal)({
usernameField:“电子邮件”,
密码字段:“passwd”
},func.);

我认为现有答案并没有明确解释问题所在:如果缺少
req.body.username
req.body.password
,Passport本地策略将抱怨缺少凭据


经常出现的错误是POST数据没有被解析,这可以通过使用
主体解析器来解决

事实上,它必须被称为
用户名
。我只使用了
名称
,反映了我自己的数据模式,这导致每次登录都失败。谢谢,+1。我的ejs模板中有一个输入错误,它处理用户的登录。邮箱中没有发送用户名。@ArcaneEngineer,这是为我做的。。。!非常感谢。我只想添加
app.use(bodyParser.urlencoded({extended:true}))