Ric*_*nes 5 express passport.js
我试图使用Express.js 4.0 Passport.js但没有发生任何事情.我按照下面的教程,并尝试调整它以适应Express.js 4.0新的路由功能.
http://scotch.io/tutorials/javascript/easy-node-authentication-setup-and-local
到目前为止,我只想尝试登录并使用正确的消息获取失败重定向视图,如LocalStrategy中所述.
这就是我在app.js中所做的事情:
1.-拉出所需的模块并创建app变量
...
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();
Run Code Online (Sandbox Code Playgroud)
2.-连接到MongoDB数据库并确保用户模型存储用户
require('./models/db')(mongoose, 'mongodb://localhost/cms');
var User = require('./models/user')(mongoose);
Run Code Online (Sandbox Code Playgroud)
4.-配置Passport
require('./config/passport')(passport, User, LocalStrategy);
Run Code Online (Sandbox Code Playgroud)
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')));
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
这是在./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);
});
}
));
};
Run Code Online (Sandbox Code Playgroud)
登录视图如下所示
正如我们所看到的,输入名称在策略中设置得恰当.
<% 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 %>
Run Code Online (Sandbox Code Playgroud)
由于there's没有用户还我期待被重定向到"/"与"不正确的用户名." 提交表单时的消息,但浏览器仍然处于加载状态,没有任何反应.
一些想法......
我打电话给:
passport.authenticate('login', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
});
Run Code Online (Sandbox Code Playgroud)
它应该被称为何处?我想要的是在对登录路由进行POST时将其称为中间件.
的日志#1实际上表示护照对象.
我有几天这个,我不知道发生了什么......我希望有人能发现一些事情,非常感谢!
我发现你没有做任何事情router.route('/login').post(除了console.log留言)
这样做: http: //passportjs.org/guide/
.post(passport.authenticate('本地', { successRedirect: '/',
失败重定向:'/登录'}))
或者使用自定义回调(如果您想保留您的console.log),您可以返回护照返回的身份验证方法。
.post(函数(req, res){
console.log('发布到/登录');
return Passport.authenticate('本地登录', function(err, user, info){
// PS: 您还可以在此处检查 err/user 以查看其他一切是否正常工作
控制台.log(错误);
控制台.log(用户);
控制台.log(信息)
})(请求、资源、下一个);
});
| 归档时间: |
|
| 查看次数: |
8490 次 |
| 最近记录: |