javascript - 提交日志后使用护照中间件对数据进行身份验证如何在多个路由中实现
问题描述
我正在尝试为我的网站创建用户注册。
我遇到了一个我很难解决的问题。
我想在使用数据库登录时验证来自用户的数据。
我的问题是我很困惑,因为我不知道将护照配置的所有代码放在哪里。
最后,我想在登录路径上显示错误消息。
希望我足够清楚。
如果您需要更多信息,请告诉我。
这是我的文件组织的图片:
这是我的代码
服务器.js
const express = require('express')
const router = express.Router()
const Users = require('./models/register')
const dotenv = require('dotenv')
dotenv.config();
const app = express()
const passport = require('passport')
const flash = require('express-flash')
const session = require('express-session')
const expressLayouts = require('express-ejs-layouts')
const indexRouter = require('./routes/index')
const registerRouter = require('./routes/register')
const loginRouter = require('./routes/login')
const initializePassport = require('./passport.config')
initializePassport(
passport,
email => users.find(user => user.email === email),
id => users.find(user => user.id === id)
)
app.set('view engine','ejs')
app.set('views', __dirname + '/views')
app.set('layout', 'layouts/layout')
app.use(expressLayouts)
app.use(express.static('public'))
app.use(express.urlencoded({ extended : false }))
app.use(flash())
app.use(session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false
}))
app.use(passport.initialize())
app.use(passport.session())
const mongoose = require('mongoose');
mongoose.connect(process.env.DATABASE_URL, {
useNewUrlParser: true, useUnifiedTopology: true}).then(()=>{
console.log('Successfully connected to the mongoDB Atlas!')
}).catch((error)=>{
console.log('impossible to connect to the mondoDB Atlas !')
console.error(error);
});
app.use('/', indexRouter)
app.use('/register', registerRouter)
app.use('/login', loginRouter)
app.listen(process.env.PORT || 3000)
登录.js
if( process.env.NODE_END !== 'production') {
require('dotenv').config()
}
const express = require('express')
const router = express.Router()
const Users = require('../models/register')
router.get('/', (req, res) =>{
res.render('login/login')
})
// router.post('/', async (req, res) =>{
// // await Users.find().then((users) =>{
// // console.log(users[0])
// // })
// console.log(req.body)
// res.redirect('/')
// })
module.exports = router
护照.config.js
const LocalStrategy = require('passport-local').Strategy
const bcrypt = require('bcrypt')
function initialize(passport, getUserByEmail, getUserById) {
const authenticateUser = async (email, password, status, done) => {
const user = getUserByEmail(email)
if (user == null) {
return done(null, false, { message: 'No user with that email' })
}
if(status == null) {
return done(null, false, { message: 'wrong page' })
}
try {
if (await bcrypt.compare(password, user.password)) {
return done(null, user)
} else {
return done(null, false, { message: 'Password incorrect' })
}
} catch (e) {
return done(e)
}
}
passport.use(new LocalStrategy({ usernameField: 'email' }, authenticateUser))
passport.serializeUser((user, done) => done(null, user.id))
passport.deserializeUser((id, done) => {
return done(null, getUserById(id))
})
}
module.exports = initialize
登录.ejs
<h1>Login</h1>
<% if (messages.error) { %>
<%= messages.error %>
<% } %>
<form action="/login" method="POST">
<%- include('../partials/register_form.ejs') %>
<button type="submit">Login</button>
</form>
<a href="Register">Register</a>
解决方案
推荐阅读
- nginx - 物理与软件负载平衡器?
- reactjs - React父子组件中useEffect的正确执行顺序是什么?
- c# - 从 C# 中的数组中查找数字
- android - 致命异常:Android 机器上的 Thread-3
- java - javafxml在带有按钮的窗格中添加第二个圆圈
- c++ - 每个线程的 random_device 是否以不同的状态开始?
- spring - 网关响应 401 而不是重定向到登录页面
- python-3.x - 同一图表上的多个图
- python - geopandas overlay() 函数在 QGIS 中不起作用
- firebase - 如何在 GitHub 操作中将工作目录添加到部署