gpt4 book ai didi

express - Passport.js 本地身份验证与 Express.js 4

转载 作者:行者123 更新时间:2023-12-04 21:15:58 27 4
gpt4 key购买 nike

我正在尝试将 Passport.js 与 Express.js 4.0 一起使用,但没有任何 react 。我正在遵循以下教程并尝试对其进行调整以适应 Express.js 4.0 的新路由功能。

http://scotch.io/tutorials/javascript/easy-node-authentication-setup-and-local

到目前为止,我只想尝试登录并使用正确的消息获取失败重定向 View ,如 LocalStrategy 中所述。

这就是我在 app.js 中所做的:

1.- 拉取所需模块并创建应用程序变量

...
var session = require('express-session');
var mongoose = require('mongoose');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var flash = require('connect-flash');
var bcrypt = require('bcrypt-nodejs');

var app = express();

2.- 连接MongoDB数据库并确保用户模型存储用户
require('./models/db')(mongoose, 'mongodb://localhost/cms');

var User = require('./models/user')(mongoose);

4.-配置 Passport
require('./config/passport')(passport, User, LocalStrategy);

5.- 确保包含所有必需的中间件
app.engine('.html', require('ejs').__express);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'html');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());

app.use(session({
secret: 'keyboardcat'
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

app.use(express.static(path.join(__dirname, 'public')));

6.- 路由处理
var router = express.Router();

router.use(function (req, res, next) {

if (req.method === 'POST' && req.url === '/login') {
// Log #1
console.log(passport);

passport.authenticate('login', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
});

} else {

next();

}
});

router.route('/')
.get(function (req, res) {
res.render('index');
});

router.route('/login')
.post(function (req, res) {
console.log('Post on /login');
})
.get(function (req, res) {
res.render('login', {
message: req.flash('loginMessage')
});
});

app.use('/', router);

... (Rest of app.js such as error handlers)

这就是在 ./config/passport.js 中设置 Passport 策略配置的方式
module.exports = function (passport, User, LocalStrategy) {

passport.serializeUser(function (user, done) {
done(null, user.id);
});

passport.deserializeUser(function(id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});

passport.use('login', new LocalStrategy({
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true
}, function (email, password, done) {

User.findOne({ email: email }, function (err, user) {

if (err) {

return done(err);

}

if (!user) {

return done(null, false, { message: 'Incorrect username.' });

}

if (!user.validPassword(password)) {

return done(null, false, { message: 'Incorrect password.' });

}

return done(null, user);

});

}

));

};

登录 View 如下所示

正如我们所见,输入名称已正确设置,就像在策略中一样。
<% include header.html %>

<% if (message.length > 0) { %>
<div><%= message %></div>
<% } %>

<form action="/login" method="post" enctype="multipart/form-data">
<input type="text" name="email"/>
<input type="password" name="password"/>
<input type="submit" value="Log In"/>
</form>

<% include footer.html %>

由于还没有用户,我希望被重定向到 '/' 使用“不正确的用户名”。提交表单时的消息,但浏览器保持在加载状态并且没有任何 react 。

一些想法...

我调用:
passport.authenticate('login', { 
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
});

应该在哪里调用?我在这里想要的是在对登录路由进行 POST 时将其称为中间件。

日志#1 实际上是显示 Passport 对象。

我有几天的时间,我无法弄清楚发生了什么......我希望有人能发现一些东西,非常感谢!

最佳答案

我看到您在 router.route('/login').post 中没有做任何事情(console.log 消息除外)

这样做:http://passportjs.org/guide/

.post(passport.authenticate('local', { successRedirect: '/',
failureRedirect: '/login' }))

或使用 custom callback (如果你想保留你的 console.log ),你返回 Passport 返回的身份验证方法。

.post(函数 (req, res){
console.log('发布到/login');
return passport.authenticate('local-login', function(err, user, info){
//PS:您也可以在此处检查 err/user 以查看其他一切是否正常
控制台日志(错误);
控制台.log(用户);
控制台日志(信息)
})(req, res, next);
});

关于express - Passport.js 本地身份验证与 Express.js 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23644692/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com