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 中导入护照配置文件。

importpassport 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:未知的身份验证策略“本地”的主要内容,如果未能解决你的问题,请参考以下文章

NestJs Passport jwt 未知策略

得到“错误”:“未知的身份验证策略\”jwt\“”

未知的身份验证策略护照

节点护照错误:未知身份验证策略“本地登录”

护照 未知的身份验证策略“本地”、“脸书”、“谷歌”

NestJS - 错误:未知的身份验证策略“本地”