node.js - 无法通过护照本地策略登录
问题描述
我正在使用护照本地策略对用户进行身份验证帐户路由它总是进入失败路由,没有给出任何错误左右这是我的代码,我做错了什么?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> 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)
解决方案
推荐阅读
- mongodb - Mongo如何排除嵌套数组中的嵌套_id
- sql - 使用 group by 获取最新的日期记录
- javascript - 使用 javascript 在 fetch 中读取 json
- security - IBM Cloud:查看特定于用户的授权(策略)所需的 IAM 访问策略?
- python - 将多个numpy图像转换为灰度
- laravel - 在 Laravel 6 中联系后向客户发送欢迎电子邮件
- python-3.x - 偏差方差权衡 KeyError
- mule - 根据条件路由流程
- asp.net - Sharepoint Online ClinetContext.ExecuteQuery 导致连接重置
- android - 底部导航视图未在整个空间中展开