gpt4 book ai didi

javascript - 如何在 Node js express 中添加密码检查中间件

转载 作者:行者123 更新时间:2023-12-03 12:17:45 24 4
gpt4 key购买 nike

我正在尝试制作一个显示表单的中间件,该表单要求输入密码以输入路由。

问题是我在 get 路由中,我无法在 get 请求中传递数据,因为我不想在 url 中传递密码。因此,我尝试制作一个中间件,它显示一个带有隐藏信息的表单,例如客户想要访问的聊天 ID 提交到另一条路线(帖子)。在发布路由中,它检查密码是否正确,如果正确则返回原始路由 (get) 并显示聊天。

这是我到目前为止所做的:

GET 路线:

router.get('/chats/:id', middleware.isLoggedIn, middleware.isAllowed, catchAsync(async (req, res, next) => {
const foundChat = await Chat.findOne({
_id: req.params.id
})
console.log('here', foundChat)
res.render('chat/show', {
chat: foundChat
})
}))

POST 路由

router.post('/chats/password', middleware.askForPassword)

中间件

middleware.isAllowed = async function (req, res, next) {
if (req.cookies.allowed) {
if (req.cookies.allowed.includes(req.params.id)) {
req.body.password = null
return next()
}
} else {
res.redirect('/chats/password')
}
}
middleware.askForPassword = async function (req, res, next) {
try {
const hashedDBPassword = await Chat.findById(req.params.id)
const password = req.body.password
const passwordHashed = hashedDBPassword.password
const cookieName = encodeURIComponent(hashedDBPassword.name)
const resultCompare = await bcrypt.compare(password, passwordHashed)
let value
if (req.cookies.allowed === undefined) {
res.cookie('allowed', [], {
maxAge: 30000,
httpOnly: true
})
}
if (resultCompare === true) {
value = req.cookies.allowed
value.push(passwordHashed)
res.cookie('allowed', value, {
maxAge: 30000,
httpOnly: true
})
res.redirect('/chats/' + req.body.id)
} else {
global.nextMiddleware = true
res.render('chat/password', {
id: req.body.id
})
}
} catch (err) {
console.log(err)
res.redirect('/chats')
}
}

表单

<% layout("layouts/boilerplate.ejs") %>
<form action="/chats/password" method="post">
<input type="password" name="password" id="password">
<input type="hidden" name="id" value="<%= id %>">
<input type="submit" value="Go!">
</form>

最佳答案

如果您希望您的代码是 RESTful,那么路由可能如下所示:

POST /auth
GET /auth
GET /auth/:sessionId
DELETE /auth/:sessionId
GET /chat/:chatId

方法POST/auth,应该设置授权cookie并返回sessionId给客户端。客户端可以将sessionId 放入localStorage。也可以有可选的参数redirect,它可以将成功的请求重定向到指定的URL。但是你应该小心使用它,不要允许重定向到外部主机。

方法 GET/auth 列出当前用户打开的所有实时 session 。当您需要关闭其他设备上的 session 时,这可能会有所帮助。

方法 GET/auth/:sessionId 通过 ID 返回 session 。它可以包含有关 session 的信息,例如上次事件、设备(浏览器或移动设备)等。

方法 DELETE/auth/:sessionId 从路由接收 sessionId,使用授权 cookie 验证 session 所有权,在数据库中标记 session 关闭(如果您将 session 存储在数据库中),并删除授权 cookie。

方法 GET/chat/:chatId 依赖于仅 HTTP 授权 cookie(像现在一样工作)。

您可以从前端通过 XHR 发送 POST 请求,收到成功的响应,然后导航到聊天。

关于javascript - 如何在 Node js express 中添加密码检查中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65113425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com