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

时间:2020-08-21 13:13:29

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

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

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

2 个答案:

答案 0 :(得分:0)

在这里看到 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';

答案 1 :(得分:0)

// 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);
});