如何将 Mongoose/Mongodb 与 node.js- 护照身份验证一起使用
Posted
技术标签:
【中文标题】如何将 Mongoose/Mongodb 与 node.js- 护照身份验证一起使用【英文标题】:How to use Mongoose/Mongodb with node.js- passport authentication 【发布时间】:2022-01-08 14:22:48 【问题描述】:我正在构建我的第一个全栈 node.js 应用程序,我想使用护照进行身份验证。我遇到了一个将用户信息存储在用户数组中的护照教程。
passport-config.js 文件:
const LocalStrategy = require('passport-local').Strategy
const bcrypt = require('bcrypt')
function initialize(passport, getUserByEmail, getUserById)
const authenticateUser = async (email, password, done) =>
const user = getUserByEmail(email)
if (user == null)
return done(null, false, message: 'No user with that email' )
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
server.js 文件
if (process.env.NODE_ENV !== 'production')
require('dotenv').config()
const express = require('express')
const app = express()
const bcrypt = require('bcrypt')
const passport = require('passport')
const flash = require('express-flash')
const session = require('express-session')
const methodOverride = require('method-override')
const initializePassport = require('./passport-config')
initializePassport(
passport,
email => users.find(user => user.email === email),
id => users.find(user => user.id === id)
)
const users = []
app.set('view-engine', 'ejs')
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())
app.use(methodOverride('_method'))
app.get('/', checkAuthenticated, (req, res) =>
res.render('index.ejs', name: req.user.name )
)
app.get('/login', checkNotAuthenticated, (req, res) =>
res.render('login.ejs')
)
app.post('/login', checkNotAuthenticated, passport.authenticate('local',
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
))
app.get('/register', checkNotAuthenticated, (req, res) =>
res.render('register.ejs')
)
app.post('/register', checkNotAuthenticated, async (req, res) =>
try
const hashedPassword = await bcrypt.hash(req.body.password, 10)
users.push(
id: Date.now().toString(),
name: req.body.name,
email: req.body.email,
password: hashedPassword
)
res.redirect('/login')
catch
res.redirect('/register')
)
app.delete('/logout', (req, res) =>
req.logOut()
res.redirect('/login')
)
function checkAuthenticated(req, res, next)
if (req.isAuthenticated())
return next()
res.redirect('/login')
function checkNotAuthenticated(req, res, next)
if (req.isAuthenticated())
return res.redirect('/')
next()
app.listen(3000)
我正在为我的应用程序使用 mongoDb 数据库,并希望将用户存储在我的数据库中。我已经对注册路径进行了必要的更改,并且可以成功地将数据存储在我的数据库中。
app.post('/register', checkNotAuthenticated, async (req, res) =>
try
const hashedPassword = await bcrypt.hash(req.body.password, 10)
const users = new User(
name: req.body.name,
email: req.body.email,
password: hashedPassword
)
await users.save()
res.redirect('/login')
catch(err)
console.log(err)
res.redirect('/register')
)
问题是当我尝试使用存储的用户数据登录时,我不断收到以下错误。
错误:需要数据和哈希参数 在 Object.compare (C:\AIT715\reactlogin\node_modules\bcrypt\bcrypt.js:208:17) 在 C:\AIT715\reactlogin\node_modules\bcrypt\promises.js:29:12 在新的承诺 () 在 Object.module.exports.promise (C:\AIT715\reactlogin\node_modules\bcrypt\promises.js:20:12) 在 Object.compare (C:\AIT715\reactlogin\node_modules\bcrypt\bcrypt.js:204:25) 在 Strategy.authenticateUser [as _verify] (C:\AIT715\reactlogin\passport-config.js:14:24) 在 processTicksAndRejections (internal/process/task_queues.js:95:5)
我已尝试对 passport-config.js 文件进行以下更改,但没有成功。
const LocalStrategy = require('passport-local').Strategy
const bcrypt = require('bcrypt')
const User = require('./models/user')
function initialize(passport, getUserByEmail, getUserById)
const authenticateUser = async (email, password, done) =>
const user = await User.find(email:email);
console.log(user);
if (user == null)
return done(null, false, message: 'No user with that email' )
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)
当我使用 console.log(user) 时,我可以获取数据,但是当我尝试使用 console.log(user.email) 时,我得到未定义。谁能建议我在这里做错了什么?或者我需要对 passport-config 文件进行哪些更改才能使其正常工作。非常感谢任何线索或帮助。
【问题讨论】:
感谢@f*** 的评论。我已经确保密码确实是原始的和散列的。在 const user = await User.find(email:email); 之后,我感觉我的代码中出现了问题。原因是我尝试过测试其他条件,例如提供一个不存在的用户,但我仍然得到相同的响应。 【参考方案1】:以防万一,将来有人会关注这个;使用 findOne 而不是 find 对我有用。
const user = await User.findOne(email:email);
【讨论】:
【参考方案2】:const passwordMatch = await bcrypt.compare(password, user.password);
确保您提供原始密码和哈希密码。这将返回一个布尔值。
【讨论】:
以上是关于如何将 Mongoose/Mongodb 与 node.js- 护照身份验证一起使用的主要内容,如果未能解决你的问题,请参考以下文章
Nodejs之MEAN栈开发---- 使用MongoDB和Mongoose创建数据模型及API