Passport:未知的身份验证策略“本地”
Posted
技术标签:
【中文标题】Passport:未知的身份验证策略“本地”【英文标题】:Passport: Unknown authentication strategy "local" 【发布时间】:2017-05-25 22:52:18 【问题描述】:我是 NodeJS 的新手,我尝试构建一个登录/注册系统。注册工作正常,但我目前无法登录。
我找到了一个使用 passport 和 nodejs 的示例应用程序,因此基于这个示例我构建了注册表单和登录表单。 http://blog.robertonodi.me/node-authentication-series-email-and-password/
当我尝试登录时,我得到一个'Unknown authentication strategy "local" error'
。谁能解释我做错了什么?
我的代码
(编辑:添加了答案/cmets 和文件名的一些更改)
快速配置 (config/express.config.js)
app.use(session(
store: new MongoStore(
url: 'mongodb://' + config.url + ':' + config.port + '/' + config.name
),
secret: 'secretkey',
key: 'skey.sid',
resave: false,
saveUninitialized: false,
cookie :
maxAge: 604800000 //7 days in miliseconds
));
app.use(passport.initialize());
app.use(passport.session());
require(path.join(__dirname, 'auth.config'))(passport); //Load passport config
app.use(function(req, res, next)
req.resources = req.resources || ;
// res.locals.app = config.app;
res.locals.currentUser = req.user;
res.locals._t = function (value) return value; ;
res.locals._s = function (obj) return JSON.stringify(obj); ;
next();
)
护照配置(config/auth.config.js)
var path = require('path');
var passport=require('passport');
var User = require(path.join(__dirname, '..', 'models', 'user.model'));
module.exports = function(passport)
passport.serializeUser(function(user, done)
done(null, false);
);
passport.deserializeUser(function(id, done)
console.log("deserializeUser called", id);
User.findById(id, function (err, user)
done(err, user);
);
);
//load strategy files
require(path.join(__dirname, 'strategies', 'local-strategy'));
//TODO: Facebook
//TODO: Twitter
//TODO: Google
本地策略 (/config/strategies/local-strategy.js)
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var mongoose = require('mongoose');
var User = mongoose.model('User');
module.exports = function ()
console.log("LocalStrategy called");
passport.use(new LocalStrategy(
usernameField : 'username',
passwordField : 'password'
,
function(username, password, done)
User.authenticate(username, password, function(err, user)
if (err)
return done(err);
if(!user)
return done(null, false, message: 'Invalid username or password');
return done(null, user);
)
))
身份验证控制器(仅限登录)(/controllers/auth.controller.js)
module.exports.loginUser = function(req,res, next)
console.log("Auth.config", path.join(__dirname, 'strategies', 'local-strategy'))
passport.authenticate('local', function (err, user, info)
if (err || !user)
console.log("Error", info);
return res.status(400).send(info);
req.logIn(user, function(err)
if (err)
return next(err);
// return res.status(404).send("Username or password incorrect");
)
res.status(200).json(user);
)(req, res, next);
【问题讨论】:
【参考方案1】:您忘记在app.js
中导入护照配置文件。
import
passport config
在初始化passport
之后。
app.use(passport.initialize());
app.use(passport.session());
// Add the line below, which you're missing:
require('./path/to/passport/config/file')(passport);
希望这会有所帮助。
【讨论】:
谢谢。我忘了复制那个代码,但我没有(护照)部分。但现在我得到一个 require(...) is not a function 错误。 什么是module.exports.init
在您的护照配置文件中,不应该是module.exports = function (passport)
更改为 module.exports = function(passport)。应用程序将立即启动,但我收到相同的错误“未知身份验证策略“本地””
哈哈。在职的!我将代码从 /strategies/local-strategy.js 移到了 auth.config,这就是结合 require 编辑的窍门!
TypeError: passport is not a function
【参考方案2】:
我已经这样做了,它成功了
$npm 安装本地护照
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy; /* this should be after passport*/
passport.use(new LocalStrategy(
function(username, password, done)
User.findOne( username: username , 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);
);
));
【讨论】:
【参考方案3】:这修复了错误。创建新的 LocalStrategy 时需要使用 'local'
passport.use('local', new LocalStrategy(
usernameField:'useName',
passwordField: 'password',
passReqToCallback: true
【讨论】:
以上是关于Passport:未知的身份验证策略“本地”的主要内容,如果未能解决你的问题,请参考以下文章