首页 > 解决方案 > 无法通过护照本地策略登录

问题描述

我正在使用护照本地策略对用户进行身份验证帐户路由它总是进入失败路由,没有给出任何错误左右这是我的代码,我做错了什么?TIA

这是我的 app.js 文件

const dotenv = require('dotenv');
const cookieParser = require('cookie-parser')
const express = require("express");
const mongoose = require('mongoose')
const session = require('express-session')
const passport = require('passport')
const connectDB = require('./config/db')
const Account = require('./models/Account')
const Assignments = require("./models/Assignments")
const { ensureAuth, ensureGuest, ensureUser } = require('./middleware/auth')
const MongoStore = require('connect-mongo')(session)
var moment = require('moment');
const bcrypt = require('bcryptjs')
const User = require('./models/User')
const flash = require('express-flash')

const app = express();
const PORT = process.env.PORT || 5000
app.listen(PORT, console.log(`Server running on port ${PORT}`))
// app.use( bodyParser.urlencoded({ extended: true }) );

dotenv.config({ path: './config/config.env' })
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
app.use(flash())

require('./config/passport')(passport)
require('./config/passport-config')(passport)
connectDB()

app.set('view engine', 'ejs')
app.use('/public', express.static('public'))
app.use(express.json())
app.use(cookieParser())

app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: false,
  store: new MongoStore({ mongooseConnection: mongoose.connection })
}))

app.use(passport.initialize())
app.use(passport.session())

app.get('/', function(req, res) {
  res.render('home');
})
app.get('/login', function(req, res) {
  res.render('login')
})
app.get('/signup', function(req, res) {
  res.render('signup')
})
app.get('/account', (req, res) => {
  res.render('account', {
    name: req.user
  })
})
app.get('/creator', (req, res) => {
  res.render('creator')
})
app.get('/dashboard', ensureUser, async (req, res) => {
  let Assignment = await Assignments.find({ uid: req?.user?._id })
  var pending = [];
  for (var i = 0 ; i < Assignment.length ; i++) {
    pending.push(moment().isAfter(moment(Assignment[i].Rework, 'DD/MM/YYYY')))
  }
  res.render('dashboard', {
    user: req.user,
    assignment: Assignment,
    moment: moment().format('DD/MM/YYYY'),
    pending: pending
  })
})
app.get('/logout', (req, res) => {
  req.logout()
  res.redirect('/')
})
app.get('/google', passport.authenticate('google', { scope: ['email', 'profile'] }))
app.get('/google/callback', passport.authenticate('google', {failureRedirect: '/'}), (req, res) => {
  res.redirect('/account')
})




app.post('/account', (req, res) => {
  console.log(req.body);
  var myAccount = new Account(req.body);
  myAccount.save()
  .then(account => {
    console.log(account);
    res.redirect('/dashboard');
  })
  .catch(err => {
    console.log(err);
  })
})

app.post('/signup', async (req, res) => {
  console.log(req.body)
  const {first_name, last_name, fullName, email, password} = req.body
  if (!first_name || typeof first_name !== 'string') {
        return res.json({ status: 'error', error: 'Invalid First Name' })
    }
  if (!last_name || typeof last_name !== 'string') {
        return res.json({ status: 'error', error: 'Invalid Last Name' })
    }
  if (!email || typeof email !== 'string') {
        return res.json({ status: 'error', error: 'Invalid Email' })
    }
  // if (!password < 5) {
    //  return res.json({ status: 'error', error: 'Password should be atleast 6 characters long' })
    // }

  const newP = await bcrypt.hash(password, 10);
  try {
    await User.create({
      displayName: fullName, firstName: first_name, lastName: last_name, email, password: newP
    })
    console.log('success');
  } catch (err) {
    console.log(err.message);
    if (err.code == 11000) {
      return res.json({ status: 'error', error: 'Email already in use' })
    }
    throw error
  }
  res.json({status: 'ok'})
})

app.post('/login', (req, res, next) => {
  passport.authenticate('local', {
    successRedirect: '/account',
    failureRedirect: '/login',
    failureFlash: true
  })(req, res, next);
});

下面是我的 passport.js 文件

const LocalStrategy = require('passport-local').Strategy
const bcrypt = require('bcryptjs')
const User = require('../models/User')

module.exports = function(passport) {
  passport.use(
    new LocalStrategy({ usernameField: 'email', passReqToCallback:true }, (email, password, done) => {
      console.log(passport);
      // Match user
      User.findOne({
        email: email
      }).then(user => {
        if (!user) {
          return done(null, false, { message: 'That email is not registered' });
        }

        // Match password
        bcrypt.compare(password, user.password, (err, isMatch) => {
          if (err) throw err;
          if (isMatch) {
            return done(null, user);
          } else {
            return done(null, false, { message: 'Password incorrect' });
          }
        });
      });
    })
  );

  passport.serializeUser(function(user, done) {
    done(null, user.id);
  });

  passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
      done(err, user);
    });
  });
};

无论如何,我的页面都会转到 /login 路由。对此真的很沮丧。下面是 login.ejs 文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <%- include("./partials/bootstrap.ejs") %>
      <link rel="stylesheet" href="../public/login.css">
      <title>Login</title>
    </head>
    <body>
      <div class="container flex font">
        <div class="card mb-4">
          <div class="card-body text-center">
            <h3 class="card-title mb-4">Login to Wafflle</h3>
            <div>Use Wafflle to build content projects at scale</div>
            <hr />
            <form class="text-left" action="/login" method="POST">
              <div class="form-group" class="text-left">
                <div class="form-row align-items-center">
                  <div class="col-12">
                    <label class="sr-only" for="inlineFormInputGroup">Email</label>
                    <div class="input-group mb-2">
                      <div class="input-group-prepend">
                        <div class="input-group-text"><i class="far fa-envelope size"></i></div>
                      </div>
                      <input type="text" class="form-control size" name="email" id="inlineFormInputGroup" placeholder="Email">
                    </div>
                  </div>
                </div>
              </div>
              <div class="form-group" class="text-left">
                <div class="form-row align-items-center">
                  <div class="col-12">
                    <label class="sr-only" for="inlineFormInputGroup">Password</label>
                    <div class="input-group mb-2">
                      <div class="input-group-prepend">
                        <div class="input-group-text"><i class="fas fa-lock-open size"></i></div>
                      </div>
                      <input type="text" class="form-control size" name="password" id="inlineFormInputGroup" placeholder="Password">
                    </div>
                  </div>
                </div>
              </div>
              <button type="submit" class="btn btn-primary btn-lg btn-block">Submit</button>
            </form>
            <h4 class="card-title mt-4">OR</h4>
          </div>
          <a class="btn btn-danger shadow mb-3 ml-3 mr-3" href='/google'><i class="fab fa-1x fa-google"></i>&nbsp;&nbsp;Sign in with Google</a>
          <div class="card-body bg-light">
            <h6 class="card-title text-center">Don't have an account yet, <a href="/signup">Sign up</a></h6>
          </div>
        </div>
      </div>
    </body>
    </html>

下面附上 User.js 模型文件

const mongoose = require('mongoose')

const UserSchema = new mongoose.Schema({
  googleId: {
    type: String,
    required: false
  },
  displayName: {
    type: String,
    required: true
  },
  firstName: {
    type: String,
    required: true
  },
  lastName: {
    type: String,
    required: true
  },
  image: {
    type: String
  },
  createdAt: {
    type: Date,
    default: Date.now()
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  password: {
    type: String,
    required: false
  }
})

module.exports = mongoose.model('User', UserSchema)

标签: node.jspassport.jspassport-local

解决方案


推荐阅读