Reputation: 815
I've already implemented Oauth 2 (google), so I'm pretty familiar with passport already and am not sure why I'm getting this error.
This is the error I'm getting:
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...
If anyone has any ideas how to fix this error, please let me know!
Here is my "local-auth-route" file:
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;
Upvotes: 2
Views: 951
Reputation: 31
Just move the parenthesis at the end of LocalStrategy({}),
From:
passport.use(
new LocalStrategy({}), function (req, email, password, done) {}
)
To:
passport.use(
new LocalStrategy({}, function (req, email, password, done) {}
))
Upvotes: 2
Reputation: 11
I solved this issue by putting the callback function inside of localStrategy parenthesis like so
passport.use( new LocalStrategy( {usernameField: 'email', passwordField: 'password', passReqToCallback: true}, function(username, password, done){ //your codes });
Upvotes: 0