首页 > 解决方案 > 提交日志后使用护照中间件对数据进行身份验证如何在多个路由中实现

问题描述

我正在尝试为我的网站创建用户注册。

我遇到了一个我很难解决的问题。

我想在使用数据库登录时验证来自用户的数据。

我的问题是我很困惑,因为我不知道将护照配置的所有代码放在哪里。

最后,我想在登录路径上显示错误消息。

希望我足够清楚。

如果您需要更多信息,请告诉我。

这是我的文件组织的图片:

文件组织

这是我的代码

服务器.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>

标签: javascriptnode.jsroutespassport.js

解决方案


推荐阅读