【问题标题】:Authentication strategies must have a name nodejs , passport身份验证策略必须有一个名称 nodejs , passport
【发布时间】:2020-12-10 21:12:27
【问题描述】:

每当我启动我的 nodemon 时,错误都会显示如下:

C:\lazystud\ravenwebAPI\node_modules\passport\lib\authenticator.js:56
  if (!name) { throw new Error('Authentication strategies must have a name'); }
               ^

Error: Authentication strategies must have a name
    at Authenticator.use (C:\lazystud\ravenwebAPI\node_modules\passport\lib\authenticator.js:56:22)
    at Object.<anonymous> (C:\lazystud\ravenwebAPI\server.js:20:10)
    at Module._compile (internal/modules/cjs/loader.js:1137:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47
[nodemon] app crashed - waiting for file changes before starting...

passport.js代码:

var { getUserByUserId } = require('../models/studentModel');
var JwtStrategy = require('passport-jwt').Strategy,
    ExtractJwt  = require('passport-jwt').ExtractJwt;
    var config      = require('../config/config');
var opts = {
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken('Authorization'),
    secretOrKey: config.jwtSecret
};

module.exports = function(passport){

passport.use(new JwtStrategy(opts, function (jwt_payload, done){ 
  console.log("in one");   
      getUserByUserId(jwt_payload.result.student_id, function (err, user) {
        if (err) {
          console.log("In iff");
          return done(err, false);
        }
        if (user) {
          console.log(user);
          console.log("in user");
          passport.serializeUser(function (user, done) {
            done(null, user);
          });
          passport.deserializeUser(function (user, done) {
            done(null, user);
          });
          return done(null, user);
        } else {
          console.log("In user else");
          return done(null, false);
        }
      });
    }
  ));
};

userRoute.js代码:

router.get('/:id', passport.authenticate( { session: true }), function(req, res) {    
    console.log("In get by id route");
    studentController.getUserByUserId(req, res);
});

server.js代码:

const app = express();
var passport = require('passport');

app.use(passport.initialize());
var passportMiddleware = require('./middleware/passport');
passport.use(passportMiddleware); 

【问题讨论】:

    标签: javascript node.js express jwt passport.js


    【解决方案1】:

    看这里 https://github.com/jaredhanson/passport/blob/08f57c2e3086955f06f42d9ac7ad466d1f10019c/lib/middleware/authenticate.js#L56-L71

    * Examples:
    *
    *     passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' });
    *
    *     passport.authenticate('basic', { session: false });
    *
    *     passport.authenticate('twitter');
    *
    

    您必须传入您要进行身份验证的策略的名称:

    passport.authenticate( "jwt", { session: true });
    

    在你的情况下是jwt:

    https://github.com/mikenicholson/passport-jwt/blob/f2044371bc9c85f22fbd30e8e58267a42dcd26ac/lib/strategy.js#L31

    this.name = 'jwt';
    

    【讨论】:

      【解决方案2】:
      // var passportMiddleware = require('./middleware/passport');
      // passport.use('jwt', passportMiddleware); 
      require('./middleware/passport')(passport);
      

      我将注释行更改为 server.js 中的下一行,现在我可以将其用于多种策略。

      router.get('/:id', passport.authenticate( "jwt-1", { session: false }), function(req, res) {    
          console.log("In get by id route");
          studentController.getUserByUserId(req, res);
      });
      

      【讨论】:

        猜你喜欢
        • 2016-05-20
        • 2021-10-29
        • 1970-01-01
        • 2017-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多