【发布时间】:2015-08-11 10:09:45
【问题描述】:
我正在使用 Passport.js 实现本地身份验证。我已经实现了 Github Oauth,这很好,但由于某种原因,本地策略因上述错误而失败。到目前为止,我找不到任何问题的根源。我已经阅读了其他帖子,但通常的答案是您应该将 require 语句更改为:
var LocalStrategy = require('passport-local').Strategy;
但是,我已经这样做了。任何帮助将非常感激。这是我的文件。我省略了github策略代码,专注于问题策略:
signin.html:
<div class="signin-bg">
<!-- <div class="modal fade" id="login-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;"> -->
<div class="modal-dialog">
<div class="loginmodal-container">
<h1>Login using Github</h1><br>
<a href="/auth/github"><i class="icon-github-sign"></i></a>
<h3>Or Use your Email</h3>
<form action="/signin" method="post">
<input type="text" name="username" placeholder="Email">
<input type="password" name="password" placeholder="Password">
<input type="submit" name="login" class="login loginmodal-submit" value="Login">
</form>
<div class="login-help">
<a href="/auth/github">Register</a> - <a href="#">Forgot Password</a>
</div>
</div>
</div>
routes.js:
var User = require('./models/userModel');
var passport = require('passport');
var authStore = require('./config/authStore');
module.exports = function(app){
app.get('/signin', function(req, res, next){
res.render('signin', { message: req.flash('signinMessage') });
});
app.post('/signin', passport.authenticate('local', {
successRedirect: '/storyBoard',
failureRedirect: '/signin',
failureFlash: true
}));
app.get('/signup', function(req, res){
res.render('signup', { message: req.flash('signupMessage') });
});
app.post('/signup', passport.authenticate('local', {
successRedirect: '/signin',
failureRedirect: '/signup',
failureFlash: true
}));
function isLoggedIn(req, res, next) {
if(req.isAuthenticated()){
return next();
}
res.redirect('/#/signin');
}
};
passport.js
var User = require('../models/userModel.js');
var passport = require('passport');
var GithubStrategy = require('passport-github').Strategy;
var LocalStrategy = require('passport-local').Strategy;
var bcrypt = require('bcrypt');
module.exports = function(passport) {
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findUserByGithubId(id, function(err, user) {
user ? done(null, user) : done(err, null);
});
});
passport.use('local', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function(req, email, password, done){
process.nextTick(function(){
User.findLocalUser(req.email, function(err, user){
if(err)
return done(err);
if(!user)
return done(null, false, req.flash('signinMessage', 'No user found'));
if(!User.generateHash(password)){
return done(null, false, req.flash('signinMessage', 'Invalid password'));
}
return done(null, user);
});
});
}
));
【问题讨论】:
-
您在应用程序的某些部分需要并正确使用github.com/jaredhanson/connect-flash? req.flash 不是标准的请求函数。
-
我上次检查时连接闪存工作正常。您认为这可能在某处未定义吗?我已经改变了一些事情,因为我有本地 Auth 与 Mongo 一起工作,但现在正在尝试使用 postgres
-
好吧,我在您的示例代码中看不到 connect-flash,我记得 connect flash 需要会话。
标签: javascript node.js authentication passport.js passport-local