node.js - Passport 不调用认证策略
问题描述
今天我试图让护照认证工作。电子邮件和密码现在是静态的,但我稍后会更改。我有很多调试消息,但只有策略之外的调试消息。不会显示有关护照的错误或警告。
我已经尝试过使用不同的正文解析器模式(extented = true,extented = false)。
战略
const LocalStrategy = require('passport-local').Strategy;
module.exports = function(passport) {
passport.use(
new LocalStrategy((email, password, done) => {
console.log('Authentication started');
var user = null;
if(email == 'test@mytest.com') {
if(password == 'test') {
user = {
email
}
console.log('Authenticated')
return done(null, user);
}
}
console.log('Error')
return done(null, user, {message: 'EMail or Password was wrong'});
})
);
passport.serializeUser(function(user, done) {
done(null, user.email);
});
passport.deserializeUser(function(id, done) {
done(err, user);
});
};
app.js(仅包含重要部分)
const express = require('express');
const expressSession = require('express-session')
const bodyParser = require('body-parser');
const expressLayouts = require('express-ejs-layouts');
const app = express();
const https = require('https');
const http = require('http');
app.use(expressSession({ secret: 'secret' }));
// Body Parser
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());
// Passport
const passport = require('passport');
require('./config/passport')(passport);
app.use(passport.initialize());
app.use(passport.session());
// View Engine
app.set('view engine', 'ejs');
app.use(expressLayouts);
app.get('/applications', (req,res) => {
res.render('applications', {
user: req.user
});
});
app.post('/applications', (req, res, next) => {
console.log(req.body);
passport.authenticate('local', {
successRedirect: '/applications',
failureRedirect: '/',
failureFlash: false
})(req, res, next);
});
https.createServer(httpsOptions, app)
.listen(7443, () => {
console.log('HTTPS Server started on Port 7443')
});
http.createServer(app)
.listen(7080, () => {
console.log('HTTP Server started on Port 7080')
});
解决方案
确保您在 POST 请求中使用了正确的字段。我注意到在您的策略中,您使用变量email
和password
。虽然您的变量名并不重要,但您在 POST 请求中发送的字段才是重要的。默认情况下,passport-local 使用 POST 字段username
和password
. 如果这些字段之一不存在,则身份验证将失败。您可以将其更改为使用email
,如下所示:
passport.use(
new LocalStrategy({
usernameField: 'email'
}, (email, password, done) => {
console.log('Authentication started');
// Your authentication strategy
})
);
假设你有正确的 POST 字段,为了req.user
在请求中使用,你必须正确设置你的passport.deserializeUser
函数。测试您的代码,身份验证策略对我来说工作正常,但是我收到一个参考错误deserializeUser
。
推荐阅读
- swift - 如何快速获取附加的tableview单元格
- microsoft-teams - Microsoft Teams:是否有可能创建用于广播的应用程序/连接器/机器人?
- arduino - arduino 的速度、时间、周期和方向步进电机
- mysql - 更新 mysql 数据库表上的重复电子邮件地址
- security - 使用来自(半)不可信来源的额外熵
- jquery - 如何使我的徽标和光标响应?
- android - Android RecognitionListener:onResults 被调用两次
- python - 找不到模板文件 Django
- node.js - 当我指定路径时,为什么猫鼬会返回空结果?
- c# - 处理通用参数的最佳方法是什么?