护照本地策略永远不会被调用
Passport local strategy is never get called
我知道这个问题在 stack over flow 中被问过很多次。我尝试了所有可接受的答案,但我的本地策略无法发挥作用。这是我的代码
var express = require('express');
var app = express();
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
app.use(cookieParser()); // read cookies (needed for auth)
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
app.set('trust proxy', 1); // trust first proxy
app.use(session({
secret: '564sdf4as564f56a7s765s4afjkgadxjkbadksj',
resave: true,
saveUninitialized: true,
cookie: { secure: true }
}));
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy({
usernameField:'userName',
passwordField:'password',
passReqToCallback : true
},function(request, userName, password, done) {
console.log(request);
UserAccount.findOne({'userName': userName} , function(err, user) {
if (err) return done(err);
if (!user) return done(null, false, 'Incorrect username.' );
user.verifyPassword(password, function(err, isMatch) {
if (isMatch) {
return done(null, user);
} else {
return done(null, false, 'Incorrect password.');
}
});
});
}));
passport.serializeUser(function(user, done) {
console.log('Serialize user called');
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
console.log('Deserialize user called');
UserAccount.findById(id, function(err, user) {
done(err, user);
});
});
然后我创建了一个类似
的路由器
var router = express.Router();
require('./controllers/user')(router,passport);
app.use('/api',router);
然后在我的用户控制器中我创建了登录函数,例如
app.post('/signIn',function (request,response,next){
var variables = request.body;
console.log(variables);
passport.authenticate('local', function(error, user, info) {
console.log(user);
if (error) { console.log(error); return next(err); }
if (!user) { return response.redirect('/login'); }
response.logIn(user, function(err) {
if (err) { return next(err); }
return response.redirect('/users/' + user.username);
});
})(request, response, next);
});
然后我从"Postman"
发送请求
{
"userName":"karthik@abc.com",
"password":"qwerty"
}
我的 mongodb 用户名和密码字段相同。
在我的数据库中有一个使用此用户名和密码的帐户。但是每次在return 'user' as 'false'里面验证。我试图在本地策略中控制我的请求,但它从未被调用过。我不明白我在这里做错了什么?有人可以帮助解决这个问题吗?非常感谢。
您应该命名本地策略并将其用于身份验证。
像这样使用 passport.use('local-strategy',new LocalStrategy({});
并且喜欢 passport.authenticate('local-strategy');
我知道这个问题在 stack over flow 中被问过很多次。我尝试了所有可接受的答案,但我的本地策略无法发挥作用。这是我的代码
var express = require('express');
var app = express();
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
app.use(cookieParser()); // read cookies (needed for auth)
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
app.set('trust proxy', 1); // trust first proxy
app.use(session({
secret: '564sdf4as564f56a7s765s4afjkgadxjkbadksj',
resave: true,
saveUninitialized: true,
cookie: { secure: true }
}));
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy({
usernameField:'userName',
passwordField:'password',
passReqToCallback : true
},function(request, userName, password, done) {
console.log(request);
UserAccount.findOne({'userName': userName} , function(err, user) {
if (err) return done(err);
if (!user) return done(null, false, 'Incorrect username.' );
user.verifyPassword(password, function(err, isMatch) {
if (isMatch) {
return done(null, user);
} else {
return done(null, false, 'Incorrect password.');
}
});
});
}));
passport.serializeUser(function(user, done) {
console.log('Serialize user called');
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
console.log('Deserialize user called');
UserAccount.findById(id, function(err, user) {
done(err, user);
});
});
然后我创建了一个类似
的路由器var router = express.Router();
require('./controllers/user')(router,passport);
app.use('/api',router);
然后在我的用户控制器中我创建了登录函数,例如
app.post('/signIn',function (request,response,next){
var variables = request.body;
console.log(variables);
passport.authenticate('local', function(error, user, info) {
console.log(user);
if (error) { console.log(error); return next(err); }
if (!user) { return response.redirect('/login'); }
response.logIn(user, function(err) {
if (err) { return next(err); }
return response.redirect('/users/' + user.username);
});
})(request, response, next);
});
然后我从"Postman"
发送请求{
"userName":"karthik@abc.com",
"password":"qwerty"
}
我的 mongodb 用户名和密码字段相同。
在我的数据库中有一个使用此用户名和密码的帐户。但是每次在return 'user' as 'false'里面验证。我试图在本地策略中控制我的请求,但它从未被调用过。我不明白我在这里做错了什么?有人可以帮助解决这个问题吗?非常感谢。
您应该命名本地策略并将其用于身份验证。
像这样使用 passport.use('local-strategy',new LocalStrategy({});
并且喜欢 passport.authenticate('local-strategy');