简体   繁体   中英

How to login user with passport.js

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM