I've been trying to setup passport with my express application. However when trying to use passport.authenticate, I recieve a 401 unauththorized on postman. I alsoing tried it on the browser, but I'm getting a similar error.
Heres my setup
userModel.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const userModel = new Schema({
username:{type:String,required:true,unique:true},
password:{type:String,required:true},
bio:{type:String},
jobs:[{type:Schema.Types.ObjectId,ref:'Job'}]
})
userModel.plugin(require('passport-local-mongoose'));
module.exports = mongoose.model('User',userModel);
passport.config.js
const mongoose = require('mongoose');
const express = require('express');
const app = express();
const passport = require('passport');
const localStrategy = require('passport-local').Strategy;
const User = require('./Models/userModel.js');
passport.use(new localStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
index.js
const userModel = require('./Models/userModel');
const jobModel = require('./Models/jobModel');
const LocalStrategy = require('passport-local').Strategy
passport.use(new LocalStrategy(userModel.authenticate()));
app.use(express.json());
app.use(require('express-session')({ secret: "secretkey", resave: true, saveUninitialized: true }));
require("./passport.config");
app.use(passport.initialize());
app.use(passport.session());
mongoose.connect(process.env.MONGO_URI,{useNewUrlParser:true},() => {
console.log('mongodb connected')
})
app.post('/login',
passport.authenticate('local'),
function(req, res) {
// If this function gets called, authentication was successful.
// `req.user` contains the authenticated user.
res.send(req.user);
});
You have set the passport.use 2 times with different mongoose schema. passport.config have this line:
passport.use(new localStrategy(User.authenticate()));
index.js have this:
passport.use(new LocalStrategy(userModel.authenticate()));
decide which one you want to use.
Also you did not set the passport-local strategy right. The strategy requires a verify callback, which accepts credentials(username and password) and calls done on finish providing user.
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (!user.verifyPassword(password)) { return done(null, false); }
return done(null, user);
});
}
));
you can also try to change this:
passport.use(new LocalStrategy(userModel.authenticate()));
to
passport.use(userModel.authenticate());
source: passport docs
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.