错误:身份验证代码丢失(Mongoose加密)


登录注册用户时出现此错误当然,我在使用dotenv来保护我的数据库加密密钥后出现了这个错误

proccess.env.SECRET目前正在上工作

我想我的问题在这里:

userSchema.plugin(encrypt, {           
secret: process.env.SECRET,         
encryptedFields: ["password"],     
});

app.js:

require("dotenv").config();
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const mongoose = require("mongoose");
const encrypt = require("mongoose-encryption");
const app = express();
app.use(express.static("public"));
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: true }));
mongoose.connect("mongodb://localhost:27017/userDB", {
useUnifiedTopology: true,
useNewUrlParser: true,
});
const userSchema = new mongoose.Schema({
email: String,
password: String,
});
//_
//     encrypting password field         // | 
userSchema.plugin(encrypt, {             // | i guess problem is here
secret: process.env.SECRET,          // |
encryptedFields: ["password"],       //_|
});
const User = mongoose.model("User", userSchema);

错误:

Error: Authentication code missing
at Object.schema.methods.authenticateSync (C:UsersAmirDesktopsecuritynode_modulesmongoose-encryptionlibpluginsmongoose-encryption.js:419:23)
at model.<anonymous> (C:UsersAmirDesktopsecuritynode_modulesmongoose-encryptionlibpluginsmongoose-encryption.js:239:47)
at Kareem.execPreSync (C:UsersAmirDesktopsecuritynode_moduleskareemindex.js:115:16)
at model.syncWrapper [as $__init] (C:UsersAmirDesktopsecuritynode_moduleskareemindex.js:232:12)
at model.Document.init (C:UsersAmirDesktopsecuritynode_modulesmongooselibdocument.js:513:8)
at completeOne (C:UsersAmirDesktopsecuritynode_modulesmongooselibquery.js:2853:12)
at model.Query.Query._completeOne (C:UsersAmirDesktopsecuritynode_modulesmongooselibquery.js:2094:7)
at Immediate.<anonymous> (C:UsersAmirDesktopsecuritynode_modulesmongooselibquery.js:2138:10)
at Immediate.<anonymous> (C:UsersAmirDesktopsecuritynode_modulesmquerylibutils.js:116:16)
at processImmediate (internal/timers.js:456:21)

我遇到了同样的问题,这对我来说很有效:

  1. 使用您的终端导航到您的数据库,使用(我可以看到您使用mongo(例如:show dbsuse databaseNameshow collectionsdb.databaseName.find(),然后是

  2. 清空你的数据库db.databaseName.drop()(如果它是重要的东西,那么把它放在安全的地方,这样你就可以再次使用它,如果你使用Postman,应该很容易(

  3. 并重新创建您的数据库

您应该删除数据库中的现有文档,并使用空文档再次运行代码。

实际上,问题是您可能正在对添加加密之前存储的数据使用新的加密,而如果您对新数据进行检查,它会正常工作,因此您应该首先创建一个新数据库,以便在其中添加新项,它有望为您工作。:(

嗯,我也遇到了同样的问题,但它只发生在以前使用mongoose加密而不使用dotenv存储在数据库中的数据上。然而,它工作良好

  1. 当您通过注册为新用户来创建新数据时
  2. 删除数据库并创建一个新数据库。(请确保在执行此操作之前先保存数据(。:(

原因是您可能更改了;加密密钥";。如果您能找到一开始创建的数据库,那么您仍然可以在(.js(文件中检查并使用该数据库。然而;错误:身份验证代码丢失(Mongoose加密(";并不意味着你毁了它。你仍然可以使用。试试

是,您应该尝试删除数据库一次,然后在中启动服务器。

您可能已经更改了您的加密";秘密";在将其传输到.env文件时进行一些编码。

别忘了在丢弃之前备份。

若要修复此错误,请删除要加密的集合(使用db.<collection-name>.drop()(,然后重新创建。

您看到此错误是因为数据库中的某些数据未加密,而其余数据已加密。

在我的案例中,错误是由findOneAndReplace的使用触发的。如果记录已经以这种方式存在,我想替换它:

const newCredentials = { userId, securedCredentials};
await Credentials.findOneAndReplace({ userId }, newCredentials, {upsert:true});

我注意到,如果我们尝试以标准方式添加对象,代码就会起作用:

await new Credentials(newCredentials).save();

因此,问题在于,我们正试图扰乱一个未加密的对象。好的,那我们加密吧!我试着调用encrypt方法,但不起作用

// The following line doesn't work. `encrypted` is undefined
const encrypted = await new Credentials(newCredentials).encrypt(); 
// This does work though...
const credentials = new Credentials(newCredentials);
credentials.encrypt((err) => {console.log(credentials)});

由于我不知道如何在原子操作中做到这一点,我只做了很长的路:

await Credentials.deleteOne({userId});
await new Credentials(newCredentials).save();

如果有人对如何使手术雾化有一个想法,那就太好了!

您的系统上没有活动的MongoDB服务器端口27017。要做到这一点,只需写";mongod";命令。

最新更新