簡體   English   中英

基本示例中的護照身份驗證失敗

[英]passport authentication failed in basic example

我試圖將這個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);

新 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 }) ); 必須注入任何護照中間件之前放置。

您的 index.html 或登錄頁面是什么樣的? 在您的帖子中,您需要確保至少在正文中發送一些包含usernamepassword字段的內容。 如果您發送沒有這些信息的帖子,您將收到Missing credentials錯誤消息。 如果您想更改這些,您可以修改本指南中顯示的參數。

您可以通過添加一個捕獲登錄錯誤的路由來自己檢查這一點,並在調用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 & password 如果沒有,您需要按照文檔中的建議傳入額外的參數。 例如

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

我認為現有的答案沒有明確解釋這個問題:如果缺少req.body.usernamereq.body.password Passport Local Strategy 會抱怨缺少憑據。

通常的錯誤是 POST 數據沒有被解析,這可以通過使用body-parser來修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM