[英]passport.js successful authentication not calling next()
我使用passport.js進行身份驗證。 看來,在成功驗證后,護照不會調用next()
,因此我的Express路線永遠不會被執行。 對於我實現的兩種身份驗證策略,我都看到了這種行為。
app.js
app.use(passport.initialize());
passport.use(authentication.local);
passport.use(authentication.bearer);
routes.setup(app, passport);
routes.js
function setup (app, passport) {
// routes.authentication.token not called, despite successful authentication.
app.post('/authentication/token', passport.authenticate('local'),
routes.authentication.token);
}
authentication.js
var local = new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password'
},
function (email, password, done) {
var user = new User({ email: email });
user.fetch({
success: function (user) {
if (bcrypt.compareSync(password, user.get('encryptedPassword'))) {
// This line shows in the console, but the route after is never executed.
console.log("LocalStrategy success!");
done(null, user); // Tell passport we have success.
} else {
done(null, false, { message: 'The password given was incorrect.' });
}
},
error: function (err) {
done(null, false, { message: 'The email address (' + email + ') does not belong to any user.' });
}
});
}
);
UPDATE
這是一個問題的單文件復制,可能比上面不完整的多文件問題更容易理解:
// ----------------------------------------------------------------------------
// Environment/Configuration
// ----------------------------------------------------------------------------
var config = require('./lib/config');
var environment = process.env.NODE_ENV || 'development';
config.load(__dirname + '/config/environment', environment);
config.loadDev(__dirname + '/config/environment', environment);
// ----------------------------------------------------------------------------
// Requirements
// ----------------------------------------------------------------------------
var express = require('express')
, passport = require('passport')
, bcrypt = require('bcrypt')
, LocalStrategy = require('passport-local').Strategy
, User = require('./app/models/user');
// ----------------------------------------------------------------------------
// HTTP Server
// ----------------------------------------------------------------------------
var app = express();
// ----------------------------------------------------------------------------
// Middleware
// ----------------------------------------------------------------------------
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(passport.initialize());
passport.use(new LocalStrategy(
{
usernameField: 'email',
passwordField: 'password'
},
function (email, password, done) {
console.log("Authenticating user.", email, password);
var user = new User({ email: email });
user.fetch({
success: function (user) {
if (bcrypt.compareSync(password, user.get('encryptedPassword'))) {
// This log statement shows in the console.
console.log("LocalStrategy success!");
done(null, user);
} else {
done(null, false, { message: 'The password given was incorrect.' });
}
},
error: function (err) {
console.log('LocalStrategy failure!');
done(null, false, { message: 'The email address (' + email + ') does not belong to any user.' });
},
complete: function (user, res) {
console.log(res);
}
});
}
));
app.post('/authentication/token', passport.authenticate('local'), function (req, res, next) {
// This line is never reached.
console.log('I\'m authenticated!');
});
// ----------------------------------------------------------------------------
// Boot
// ----------------------------------------------------------------------------
app.listen(process.env.PORT);
console.log('Server started on port: %d', process.env.PORT);
我有同樣的問題,我不小心從我的serializeUser函數中刪除了回調。
也許檢查序列化和反序列化功能是否正確。
下面的代碼是我使用的,您的可能會有所不同,具體取決於您是使用用戶的ID進行序列化還是使用其他字段。
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
問題似乎是Express中間件的排序。 app.use(passport.initialize());
和護照設置需要在 app.use(app.router);
之前 app.use(app.router);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.