Passport js本地策略:TypeError:LocalStrategy需要验证回调

问题描述

使用Node&express-Passport JS本地策略


我已经实现了Oauth 2(google),所以我已经非常熟悉通行证,并且不确定为什么会出现此错误

这是我得到的错误

C:\Users\Elijah\.projects\tutorials\web-socket-io\node_modules\passport-local\lib\strategy.js:47
  if (!verify) { throw new TypeError('LocalStrategy requires a verify callback'); }
                 ^

TypeError: LocalStrategy requires a verify callback
    at new Strategy (C:\Users\Elijah\.projects\tutorials\web-socket-io\node_modules\passport-local\lib\strategy.js:47:24)
    at Object.<anonymous> (C:\Users\Elijah\.projects\tutorials\web-socket-io\src\routes\local-auth-routes.js:43:5)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Module.require (internal/modules/cjs/loader.js:849:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (C:\Users\Elijah\.projects\tutorials\web-socket-io\src\app.js:7:21)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
[nodemon] app crashed - waiting for file changes before starting...

如果有人对如何解决错误有任何想法,请告诉我!

这是我的“本地身份验证路由”文件

const router = require('express').Router();
const passport = require('passport');
const express = require('express');
const LocalStrategy = require('passport-local').Strategy;

require('dotenv').config();

const keys = require('../config/keys');
const UserService = require('../config/passport-setup-service');
const knex = require('knex');
const { DATABASE_URL } = require('../config');

const db = knex({
    client: 'pg',connection: DATABASE_URL,});

router.get('/',(req,res,next) => {
    console.log("/ endpoint");
    console.log(JSON.stringify(req.user));

    res.send(req.user);
  });

// auth logout
router.get('/out',res) => {
    // handle with passport
    req.logout();
    res.send(JSON.stringify('logging out'));
});

// PAsspORT STRATEGY
// ---------------------------------------

passport.use(
    new LocalStrategy({
        usernameField: 'email',passwordField: 'password',passReqToCallback: true
    }),function (req,email,password,done) {
        console.log('LOCAL STRATEGY');
        //check if user exists in database
        UserService.hasUserWithEmail(db,email)
        .then(currentUser => {
            //If the user is in the database then pass them into the callback function
            if (currentUser) {
                console.log('USING USER');
                UserService.comparePasswords(password,currentUser.password)
                .then(compareMatch => {
                    if(!compareMatch){
                        return done(null,{message: 'Password Incorrect'});
                    }
                    else{
                        //user is authenticated
                        return done(null,currentUser);
                    }
                });
            }
            
            return done(null,{});
     
        });
});
// ---------------------------------------


/* This is another problem,whether passing params or body,they both come up empty (I've already tried const jsonParser = express.json();) */
router.post('/login/:data',next) => {
    console.log('in login');
    //console.log(req);
    console.log(req.body);
    console.log(req.params.data);
    //app.set('body',req.body);

    res.redirect(302,'/local/auth')

})
router.post('/auth',next) => {
    console.log('LOCAL CUSTOM REDIRECT');
    passport.authenticate(['local'],{
        session: true,failureRedirect: '/testF',successRedirect: '/testS',})(req,next);
    console.log('passport user',req.user);
    if(req.user){
        res.send(req.user);
    }
    else{
        console.log('Failed,no req.user');
        res.send({});
    }
});

router.get('/testF',res) => {
    console.log('Failed');
});

router.get('/testS',res) => {
    console.log('passed');
})



//Serialize the user id
passport.serializeUser( (user,done) => {
    console.log('LOCAL: in serialize');
    done(null,user.user_email);//id in the database
});

passport.deserializeUser( (email,done) => {
    //find the user id in the database
    console.log('in DEserialize');
    console.log('email: ',email);
    //Locating the user in the database
    UserService.hasUserWithEmail(
        db,)
    .then(userInfo => {
        console.log('LOCAL: returned from service: ',userInfo);
        //If the user exists then pass into the callback function,else,pass in empty object
        if(userInfo) done(null,userInfo);
        else done(null,{});
    })
    .catch (err => {
        console.error('LOCAL: ERROR THROWN trying to access database: ',err);
    });
});


module.exports = router;

App.js:

//  --- requirements ---
require('dotenv').config();
const express = require('express');

const authRoutes = require('./routes/auth-routes');
const userRoutes = require('./routes/user-routes');
const localRoutes = require('./routes/local-auth-routes');

const morgan = require('morgan');
const cors = require('cors');
const helmet = require('helmet');
const { NODE_ENV } = require('./config');
const passportSetup = require('./config/passport-setup');
const keys = require('./config/keys')
const cookieSession = require('cookie-session');
const passport = require('passport');

//  --- middleware ---
const app = express();
var bodyParser = require('body-parser');

const morganoption = (NODE_ENV === 'production')
  ? 'tiny'
  : 'common';

app.use(morgan(morganoption));
app.use(helmet());
//app.use(cors());
app.use(cors({
  origin : 'http://localhost:3000',credentials: true,// <= Accept credentials (cookies) sent by the client
}));


app.use(bodyParser.urlencoded({
  extended: true
}));

app.use(cookieSession({
  maxAge: 24*60*60*1000,keys: [keys.session.cookieKey]
}));

//init passport
app.use(passport.initialize());
app.use(passport.session());

app.use('/local',localRoutes);
app.use('/auth',authRoutes);
app.use('/user',userRoutes);

//  --- endpoints ---
app.get('/',next) => {
  console.log("/");

  res.send(JSON.stringify('Hello World!!!'))
});

app.use((error,req,next) => {
    let response
    if (NODE_ENV === 'production') {
      response = { error: { message: 'server error' }}
    } else {
      response = { error }
    }
    res.status(500).json(response)
  })
  

//  --- export ---
module.exports = app;

解决方法

我通过将回调函数放在 localStrategy 括号内解决了这个问题 像这样

passport.use( new LocalStrategy( {usernameField: 'email',passwordField: 'password',passReqToCallback: true},function(username,password,done){ //your codes });