问题描述
使用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 });