Javascript Passport.js“护照”;“未定义”不是一个函数;使用本地策略
我正在使用Passport.js实现本地身份验证。我已经实现了Github Oauth,这很好,但是由于某种原因,本地策略失败了,出现了上述错误。到目前为止,我找不到任何问题的根源。我读过其他帖子,但通常的回答是您应该将require语句更改为:Javascript Passport.js“护照”;“未定义”不是一个函数;使用本地策略,javascript,node.js,authentication,passport.js,passport-local,Javascript,Node.js,Authentication,Passport.js,Passport Local,我正在使用Passport.js实现本地身份验证。我已经实现了Github Oauth,这很好,但是由于某种原因,本地策略失败了,出现了上述错误。到目前为止,我找不到任何问题的根源。我读过其他帖子,但通常的回答是您应该将require语句更改为: var LocalStrategy = require('passport-local').Strategy; 不过,我已经这样做了。任何帮助都将不胜感激。这是我的档案。我省略了github策略代码,以关注问题策略: sign.html: <
var LocalStrategy = require('passport-local').Strategy;
不过,我已经这样做了。任何帮助都将不胜感激。这是我的档案。我省略了github策略代码,以关注问题策略:
sign.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>
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);
});
});
}
));
好吧,我不确定你到底做错了什么,因为你没有粘贴所有的代码,但这里有一个快速愚蠢的工作样本,带有passport和connect flash,祝你好运
var express = require('express');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var flash = require('connect-flash');
// You need session to use connect flash
var session = require('express-session');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use( session({
saveUninitialized : true,
secret : 'Some Secret' ,
resave : true,
}));
app.use( passport.initialize());
app.use( passport.session());
app.use(flash());
// Authentication
passport.use(
new LocalStrategy(
{},
function(username, password, done) {
// Fake user definition, just a sample.
var user = {name: 'fake', password: 'fake'};
// Here you can put your async authentication method from db
if(user.name === username && user.password === password) {
return done(null, {
username: username
});
}
else {
return done(null, false,{});
}
})
);
passport.serializeUser( function(user, done) {
return done(null, user);
});
passport.deserializeUser( function(user, done) {
return done(null, user);
});
app.get('/', function(req, res) {
var htmlToSend = '';
var error = req.flash('error')[0];
if(error)
htmlToSend += '<div style="background-color:red; width:30%;">' + error + '</div>';
htmlToSend += '<form action="/login" method="post"> \
<input name="username"/> \
<input type="password" name="password"/> \
<button> send \
</form>';
res.send(htmlToSend);
});
app.post('/login', passport.authenticate('local', {
failureRedirect: '/',
successFlash: 'Welcome!',
failureFlash: 'User/Password Invalid!'
}),
function(req, res) {
res.send('Loged In as '+ req.user.username);
});
app.listen(3000, function() {
console.log('started');
});
var express=require('express');
var passport=需要(“passport”);
var LocalStrategy=require('passport-local')。策略;
var闪存=需要(“连接闪存”);
//您需要会话才能使用connect flash
var会话=需要(“快速会话”);
var bodyParser=require('body-parser');
var-app=express();
use(bodyParser.urlencoded({extended:true}));
应用程序使用(会话)({
saveUninitialized:true,
秘密:“一些秘密”,
雷萨夫:是的,
}));
app.use(passport.initialize());
app.use(passport.session());
应用程序使用(flash());
//认证
passport.use(
新本地策略(
{},
函数(用户名、密码、完成){
//假用户定义,只是一个示例。
var user={name:'fake',password:'fake'};
//在这里,您可以将您的异步身份验证方法放在db中
if(user.name==username&&user.password==password){
返回完成(空{
用户名:username
});
}
否则{
返回完成(null,false,{});
}
})
);
passport.user(函数(user,done){
返回完成(空,用户);
});
passport.deserializeUser(函数(user,done){
返回完成(空,用户);
});
app.get('/',函数(req,res){
var htmlToSend='';
var error=req.flash('error')[0];
如果(错误)
htmlToSend+=''+错误+'';
htmlToSend+='\
\
\
发送\
';
res.send(htmlToSend);
});
app.post('/login',passport.authenticate('local'){
failureRedirect:“/”,
successFlash:“欢迎!”,
failureFlash:“用户/密码无效!”
}),
功能(req、res){
res.send('作为'+req.user.username'登录);
});
app.listen(3000,函数(){
log('started');
});
您在应用程序的某些部分中是否需要并正确使用?req.flash不是标准请求功能。上次检查时,连接闪存工作正常。你认为这可能是未定义的吗?我已经改变了一些事情,因为我让本地Auth与Mongo一起工作,但我现在正在使用postgreswell进行尝试。我在您的示例代码中看不到connect flash,并且我记得connect flash需要会话。我确实通过包括以下内容克服了此错误:app.use(flash());谢谢