我正嘗試使用Facebook和本地策略進行多策略身份驗證。在Facebook的身份驗證,一般的工作和我的數據庫得到更新,但本地策略給了我以下錯誤:當使用本地策略進行身份驗證時,Passportjs引發500服務器錯誤
TypeError: undefined is not a function
at allFailed (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:111:15)
at attempt (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:160:28)
at Strategy.strategy.fail (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:277:9)
at Strategy.authenticate (/Users/r/Desktop/jb/node_modules/passport-local/lib/strategy.js:75:17)
at attempt (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:341:16)
at authenticate (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:342:7)
at Layer.handle [as handle_request] (/Users/r/Desktop/jb/node_modules/express/lib/router/layer.js:82:5)
at next (/Users/r/Desktop/jb/node_modules/express/lib/router/route.js:110:13)
at Route.dispatch (/Users/r/Desktop/jb/node_modules/express/lib/router/route.js:91:3)
at Layer.handle [as handle_request] (/Users/r/Desktop/jb/node_modules/express/lib/router/layer.js:82:5)
at /Users/r/Desktop/jb/node_modules/express/lib/router/index.js:267:22
at Function.proto.process_params (/Users/r/Desktop/jb/node_modules/express/lib/router/index.js:321:12)
at next (/Users/r/Desktop/jb/node_modules/express/lib/router/index.js:261:10)
at SessionStrategy.strategy.pass (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:318:9)
at SessionStrategy.authenticate (/Users/r/Desktop/jb/node_modules/passport/lib/strategies/session.js:67:10)
at attempt (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:341:16)
這裏是代碼本身:
'use strict';
var passport = require('passport');
var FacebookStrategy = require('passport-facebook').Strategy;
var LocalStrategy = require('passport-local').Strategy;
module.exports = function(app, User) {
app.use(passport.initialize());
// Enable sessions
app.use(passport.session());
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (!user.verifyPassword(password)) { return done(null, false); }
return done(null, user);
});
}
));
passport.use(new FacebookStrategy({
clientID: 1234544646,
clientSecret: "sertysehtrhr345345345234234",
callbackURL: "http://localhost:5000/auth/facebook/callback"
},
function(accesstoken, tokenSecret, profile, done) {
// Could be an existing user or a new user
// profile.username is used as the username
User.findOrCreate({
where: {
username: profile.id,
email: profile.emails[0].value,
displayName: profile.displayName
}
}).spread(function(user) {
return done(null, user);
});
}));
// This just stores the username is an encrypted browser cookie
passport.serializeUser(function(user, done) {
done(null, user.username);
});
// This fetches the user by username retrieved from the
// cookie that was set during serializeUser
passport.deserializeUser(function(uname, done) {
console.log(uname)
User.find({
where: {
username: uname
}
}).then(function(user) {
if (!user) return done(new Error('Invalid user'));
return done(null, user);
});
});
// Redirect the user to facebook for authentication. When complete, Facebook
// will redirect the user back to the application at /auth/facebook/callback
//app.get('/auth/facebook', passport.authenticate('facebook'));
app.get('/auth/facebook',
passport.authenticate('facebook', { scope: ['email']}),
function(req, res){
});
// Facebook will redirect the user to this URL after approval. Finish the
// authentication process by attempting to obtain an access token. If access
// was granted, the user will be logged in. Otherwise, authentication has failed.
app.get('/auth/facebook/callback',
passport.authenticate('facebook', {
failureRedirect: '/login'
}),
function(req, res) {
res.cookie('signIn', 'true');
res.redirect('/');
}
);
app.get('/api/users', function(req, res) {
res.render({
message: req.flash('loginMessage')
});
});
app.post('/api/users',
passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
})
);
// This is the middleware that needs to be used for
// protecting APIs that require authorization
return function(req, res, next) {
// if user is authenticated in the session, carry on
if (req.isAuthenticated())
return next();
// if they aren't redirect them to the login page /auth/twitter
res.redirect('/');
};
};
我做一個崗位/ API /用戶。任何想法發生了什麼?
要調用一個沒有被定義的功能。你甚至嘗試過調試嗎? –
你將如何去調試呢?對不起,新的節點?什麼功能沒有定義? – rahul2001
我不知道什麼功能,這就是你需要調試的東西。在幾乎所有編程平臺中都可以使用的簡單方法是使用寫入控制檯的函數。您將使用它來輸出一些值,並使用它們來跟蹤代碼的執行情況,以查看錯誤發生的位置。在node.js中,您要使用的函數是console.log。 –