如何将 Mongoose/Mongodb 与 node.js- 护照身份验证一起使用

     2023-02-22     161

关键词:

【中文标题】如何将 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 常量文档

】创建Mongoose/MongoDB常量文档【英文标题】:CreatingMongoose/MongoDBconstantdocuments【发布时间】:2019-06-0917:51:36【问题描述】:我正在尝试对我正在编写的NodeJS程序实施一种基于角色的访问控制。这些角色将使用Mongoose与所有其他数据... 查看详情

如何对 mongoose/mongodb 和 nodejs 中的对象数组进行排序?

】如何对mongoose/mongodb和nodejs中的对象数组进行排序?【英文标题】:Howtosortarrayofobjectinmongoose/mongodbandnodejs?【发布时间】:2021-10-0221:17:02【问题描述】:我想找到一个品牌,然后根据价格按升序和降序对与该品牌关联的产品进行... 查看详情

如何在 Mongoose(MongoDB 包装器)中删除一行 [重复]

】如何在Mongoose(MongoDB包装器)中删除一行[重复]【英文标题】:HowtodeletearowinMongoose(MongoDBwrapper)[duplicate]【发布时间】:2019-08-1108:50:04【问题描述】:我想通过使用Mongoose(MongoDB的包装器)删除文档中的一行//thisisthedocument\'userna... 查看详情

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

】如何在mongoose/mongodb查询子文档中使用mapreduce?【英文标题】:howtousemapreduceinmongoose/mongodbquerysubdocument?【发布时间】:2014-01-2200:54:28【问题描述】:我在mongoose/mongodb中实现了一个简单的消息系统,架构如下varschema=newmongoose.Schem... 查看详情

如何在 mongoose/mongodb 查询子文档中使用 mapreduce?

】如何在mongoose/mongodb查询子文档中使用mapreduce?【英文标题】:howtousemapreduceinmongoose/mongodbquerysubdocument?【发布时间】:2014-01-2200:54:28【问题描述】:我在mongoose/mongodb中实现了一个简单的消息系统,架构如下varschema=newmongoose.Schem... 查看详情

使用 Mongoose/MongoDB 构建我的模型

】使用Mongoose/MongoDB构建我的模型【英文标题】:StructuringMyModelswithMongoose/MongoDB【发布时间】:2017-12-1621:02:58【问题描述】:我最近开始深入研究服务器端,并且正在开发一个应用程序,我需要考虑如何规划我的模型。我的用户... 查看详情

Mongoose/Mongodb Aggregate - 对多个字段进行分组和平均

】Mongoose/MongodbAggregate-对多个字段进行分组和平均【英文标题】:Mongoose/MongodbAggregate-groupandaveragemultiplefields【发布时间】:2021-10-2218:40:35【问题描述】:我有一个包含2个字段的Post模型:日期和评级。我将如何获得每个日期的平... 查看详情

Mongoose/Mongodb Aggregate - 对多个字段进行分组和平均

】Mongoose/MongodbAggregate-对多个字段进行分组和平均【英文标题】:Mongoose/MongodbAggregate-groupandaveragemultiplefields【发布时间】:2021-10-2218:40:35【问题描述】:我有一个包含2个字段的Post模型:日期和评级。我将如何获得每个日期的平... 查看详情

Mongoose / Mongodb 迁移到 MySQL

】Mongoose/Mongodb迁移到MySQL【英文标题】:Mongoose/MongodbmigrationtoMySQL【发布时间】:2017-07-0517:17:02【问题描述】:我有一个使用mongodb数据库运行的NodeJS项目(使用mongoose)。出于技术限制的原因,我需要将应用程序从使用mongodb迁移... 查看详情

如何使用 Autopopulate Mongoose Mongodb 选择要检索的字段?

】如何使用AutopopulateMongooseMongodb选择要检索的字段?【英文标题】:HowcaniselectthefieldsthatiwantretrieveusingAutopopulateMongooseMongodb?【发布时间】:2020-12-1822:30:32【问题描述】:我正在使用插件mongoose-autopopulate但我不知道如何指定要从填... 查看详情

如何使用 Autopopulate Mongoose Mongodb 选择要检索的字段?

】如何使用AutopopulateMongooseMongodb选择要检索的字段?【英文标题】:HowcaniselectthefieldsthatiwantretrieveusingAutopopulateMongooseMongodb?【发布时间】:2020-12-1822:30:32【问题描述】:我正在使用插件mongoose-autopopulate但我不知道如何指定要从填... 查看详情

如何找到field1大于field2的文档? (Nodejs/Mongoose/MongoDB)

】如何找到field1大于field2的文档?(Nodejs/Mongoose/MongoDB)【英文标题】:Howtofinddocumentswherefield1isgreaterthanfield2?(Nodejs/Mongoose/MongoDB)【发布时间】:2015-09-2107:04:22【问题描述】:在执行查询时如何使用字段中的值进行比较?来自文档的... 查看详情

将图像文件从 React 前端上传到 Node/Express/Mongoose/MongoDB 后端(不工作)

】将图像文件从React前端上传到Node/Express/Mongoose/MongoDB后端(不工作)【英文标题】:UploadimagefilefromReactfrontendtoNode/Express/Mongoose/MongoDBbackend(notworking)【发布时间】:2019-04-1621:17:16【问题描述】:我花了一天的大部分时间来研究这... 查看详情

如何在 Vercel 上使用 Mongoose(MongoDB)连接部署 Next JS App?

】如何在Vercel上使用Mongoose(MongoDB)连接部署NextJSApp?【英文标题】:HowtodeployNextJSAppwithMongoose(MongoDB)connectiononVercel?【发布时间】:2022-01-2011:45:32【问题描述】:我在使用mongodb连接在vercel上部署我的下一个js应用程序时遇到问题... 查看详情

Mongoose/MongoDB:$in 和 .sort()

】Mongoose/MongoDB:$in和.sort()【英文标题】:Mongoose/MongoDB:$inand.sort()【发布时间】:2017-05-1822:00:18【问题描述】:我使用了一个API,它每天跟踪50个成员在游戏中的数据,并使用mongoose将JSON转换为集合中的单个文档。几天之间有一... 查看详情

Mongoose/MongoDB:获取倒数第二个文档

】Mongoose/MongoDB:获取倒数第二个文档【英文标题】:Mongoose/MongoDB:Getsecondtolastdocument【发布时间】:2018-05-0119:19:21【问题描述】:如何使用Mongoose获取第二天到最新或前一天的文档集?我获取最新数据的代码如下:data.findOne().sort(... 查看详情

Mongoose Mongodb 查询对象数组

】MongooseMongodb查询对象数组【英文标题】:MongooseMongodbqueryinganarrayofobjects【发布时间】:2014-05-1310:24:30【问题描述】:在使用Mongoose查询数组时,我很难得到我期望看到的结果。一个用户可以有许多与他/她的帐户相关联的房间。... 查看详情

Mongoose / MongoDB _id 作为字符串

】Mongoose/MongoDB_id作为字符串【英文标题】:Mongooose/MongoDB_idasString【发布时间】:2019-03-1220:30:06【问题描述】:我在从MongoDB获取数据时遇到了问题。我得到了IDcannotrepresentvalue:_bsontype:"ObjectID",...有人说:将每个模型的_id声... 查看详情