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

时间:2020-08-25 22:35:52

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

使用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', (req, 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', (req, res, 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', (req, res, next) => {
    console.log('LOCAL CUSTOM REDIRECT');
    passport.authenticate(['local'], {
        session: true,
        failureRedirect: '/testF',
        successRedirect: '/testS',
    })(req,res,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', (req,res) => {
    console.log('failed');
});

router.get('/testS', (req,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,
        email,
    )
    .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('/', (req, res,next) => {
  console.log("/");

  res.send(JSON.stringify('HELLO WORLD!!!'))
});

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

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

1 个答案:

答案 0 :(得分:0)

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

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