【问题标题】:Error with passportjs: Unknown authentication strategy "local"passportjs 错误:未知身份验证策略“本地”
【发布时间】:2014-02-22 14:58:23
【问题描述】:

我正在开发一个 nodejs 应用程序并使用 passportjs 进行身份验证。我正在使用本地护照策略。但是当我尝试登录时,出现以下错误:

Error: Unknown authentication strategy "local"
    at attempt (/home/project/node_modules/passport/lib/middleware/authenticate.js:166:37)
    at authenticate (/home/project/node_modules/passport/lib/middleware/authenticate.js:338:7)
    at exports.authenticate (/home/project/controllers/RegistrationsController.js:87:4)
    at callbacks (/home/project/node_modules/express/lib/router/index.js:164:37)
    at param (/home/project/node_modules/express/lib/router/index.js:138:11)
    at pass (/home/project/node_modules/express/lib/router/index.js:145:5)
    at Router._dispatch (/home/project/node_modules/express/lib/router/index.js:173:5)
    at Object.router (/home/project/node_modules/express/lib/router/index.js:33:10)
    at next (/home/project/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at /home/project/node_modules/express-flash/lib/express-flash.js:31:7

这是我的 passport-config.js 文件:

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var User = require('../models/user');

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({usernameField: 'emailAddress'}, new LocalStrategy(function(username, password, done) {
  User.findOne({ emailAddress: username }, function(err, user) {
    if(err){
        return done(err);
    }
    if (!user) {
        return done(null, false, { message: 'Email ' + username + ' not found'});
    }
    else{
        //check if password matches and pass parameters in done accordingly
         }
     });
}));

以下是我的 RegistrationsController.js 文件,我的身份验证 api 所在的位置,

var passport = require('passport');

exports.authenticate = function(req, res, next){
    console.log('Login request!');
    passport.authenticate('local', function(err, user, info) {
        console.log('In authenticate callback!');
    if (err) return next(err);

    if (!user) {
      req.flash('errors', { msg: info.message });
      res.status(500).json({message: info.message});
    }
      res.json(user);
    })(req, res, next);
}

过去 2 天以来一直在查看代码,但仍无法找出错误。我已经安装了 passportpassport-local 模块。任何帮助将不胜感激。

【问题讨论】:

    标签: node.js passport.js


    【解决方案1】:

    此代码中存在语法错误。 usernameField: 'emailAddress' 必须像这样在 LocalStrategy 构造函数中传递...

    passport.use(new LocalStrategy({
       usernameField: 'email'
    }, yourAuthenticateFunction));
    

    【讨论】:

      【解决方案2】:

      这发生在我身上,因为即使我的 app.ts 文件正在导入护照配置,我也没有将它分配给任何路线,因此该文件从未被解析。我在控制器中使用它来验证POST /login

      免责声明 - 我不确定“已解析”是否是正确使用的词,但似乎是这样,因为该文件中的 console.log('xfngr') 直到我之后才输出把路线放进去。

      app.ts

      ...
      import * as passportConfig from "./config/passport";
      ...
      ...
      

      我添加了一个使用来自passportConfig 的属性的路由,它又开始工作了。

      app.ts

      ...
      import * as passportConfig from "./config/passport";
      ...
      ...
      ...
      app.get("/account", passportConfig.isAuthenticated, userController.getAccount);
      

      【讨论】:

        【解决方案3】:

        npm install --save passport-local 然后在 app.js 中包含这一行 var LocalStrategy = require("passport-local"); 然后使用这个中间件:

        app.use(passport.initialize());
        app.use(passport.session());
        passport.use(new LocalStrategy(User.authenticate()));
        passport.serializeUser(User.serializeUser());
        passport.deserializeUser(User.deserializeUser());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-11
          • 2021-12-15
          • 1970-01-01
          • 2018-06-08
          • 2022-07-19
          • 2017-05-25
          • 2016-02-28
          • 1970-01-01
          相关资源
          最近更新 更多