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



使用节点&express-Passport JS本地策略


我已经实现了Oauth 2(谷歌(,所以我已经非常熟悉passport了,不知道为什么会出现这个错误。

这是我得到的错误:

C:UsersElijah.projectstutorialsweb-socket-ionode_modulespassport-locallibstrategy.js:47
if (!verify) { throw new TypeError('LocalStrategy requires a verify callback'); }
^
TypeError: LocalStrategy requires a verify callback
at new Strategy (C:UsersElijah.projectstutorialsweb-socket-ionode_modulespassport-locallibstrategy.js:47:24)
at Object.<anonymous> (C:UsersElijah.projectstutorialsweb-socket-iosrcrouteslocal-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:UsersElijah.projectstutorialsweb-socket-iosrcapp.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;

只需移动LocalStrategy({}(末尾的括号,

发件人:

passport.use(
new LocalStrategy({}), function (req, email, password, done) {}  
)

收件人:

passport.use(
new LocalStrategy({}, function (req, email, password, done) {}  
))

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

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

最新更新