身份验证策略必须具有名称nodejs,passport

问题描述

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

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,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); 

解决方法

在这里看到 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';
,
// 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);
});