javascript 如何使用next.js、mongoDB和bcrypt实现一个简单且保存的密码验证?

wgx48brx  于 2023-05-16  发布在  Java
关注(0)|答案(1)|浏览(120)

我是一个业余程序员,不需要一个行业标准,我的项目。然而,我想在我的next.js项目中实现一个相当安全的密码认证,并且只使用我的next.js后端API和MongoDB(Atlas via Data API)来实现这个目的。
我知道有不同的第三方身份验证过程可用,并且有更安全的选项。因此,我想强调的是,我在寻找一个更低层次的东西。
我的基本设置是,用户数据与名称和密码(bcrypt加密)存储在我的数据库。现在,当用户输入他们的登录数据时,我不知道如何继续。在某些时候,我必须执行bcrypt.compare(password, hashedPassword)来验证密码。然而,在我的理解中,我要么必须将散列密码发送到我的前端(感觉不对),要么通过HTTP请求将密码以纯文本发送到后端(感觉也不对)。密码的客户端侧散列是不可能的,因为在使用盐(例如bcrypt.hash(password, 10)),我不能比较两个散列字符串。
有人能简单地向我解释一下如何在此设置中最好地比较密码吗?

ldioqlga

ldioqlga1#

您没有向客户端发送任何凭据。你处理服务器上的一切。
您将用户输入(电子邮件、密码等)发送到服务器。服务器首先必须验证这些值。然后在服务器上从数据库获取用户。

// you validated the req.body data first
let user = await User.findOne({ email: req.body.email });
if (!user) return res.status(400).send("invalid password or email");

user保存用户数据。我假设你已经散列的密码时,用户注册。

const validPassword = await bcrypt.compare(req.body.password, user.password);
if (!validPassword) return res.status(400).send("invalid email or password");

当你从客户端向服务器发送数据时,你正在通过https发送它不是纯文本。该数据由tls protocol加密
需要注意的是,TLS不保护终端系统上的数据。它只是确保通过互联网安全传输数据,避免可能的窃听和/或更改内容。

相关问题