Javascript 如何在node js express中添加密码检查中间件
我试图制作一个中间件,它显示一个表单,请求输入密码以进入路由 问题是我处于get路由中,无法在get请求中传递数据,因为我不想在url中传递密码。因此,我尝试制作一个中间件,它显示一个表单,其中包含隐藏的信息,例如客户想要访问的聊天的id,并提交到另一个路由(post)。在post路由中,它会检查密码是否正确,是否正确,然后返回原始路由(get)并显示聊天记录 以下是我迄今为止所做的工作: 获取路径:Javascript 如何在node js express中添加密码检查中间件,javascript,node.js,express,bcrypt,Javascript,Node.js,Express,Bcrypt,我试图制作一个中间件,它显示一个表单,请求输入密码以进入路由 问题是我处于get路由中,无法在get请求中传递数据,因为我不想在url中传递密码。因此,我尝试制作一个中间件,它显示一个表单,其中包含隐藏的信息,例如客户想要访问的聊天的id,并提交到另一个路由(post)。在post路由中,它会检查密码是否正确,是否正确,然后返回原始路由(get)并显示聊天记录 以下是我迄今为止所做的工作: 获取路径: router.get('/chats/:id', middleware.isLoggedIn,
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
})
}))
邮政路线
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
放入本地存储。还可以有可选的参数重定向,它可以将成功的请求重定向到指定的URL。但是您应该小心地使用它,并且不允许重定向到外部主机
方法GET/auth
列出当前用户打开的所有实时会话。当您需要关闭其他设备上的会话时,它可能会有所帮助
方法GET/auth/:sessionId
通过会话ID返回会话。它可以包含有关会话的信息,如上次活动、设备(浏览器或移动设备)等
方法DELETE/auth/:sessionId
从路由接收sessionId
,使用授权cookie验证会话所有权,在DB中标记会话已关闭(如果将会话存储在DB中),并删除授权cookie
方法GET/chat/:chatId
依赖于仅HTTP的授权cookie(像现在一样工作)
您可以从前端通过XHR发送POST请求,收到成功响应,然后导航到聊天室。请详细说明,为什么不使用POST路由?@PaulRumkin,我想使用RESTful路由让我确定一下,您是否使用签名cookie?@PaulRumkin不,不太可能,那么您的应用程序将容易受到外部设置cookie的攻击。坏演员将能够手动设置此cookie,例如从curl util和读取任何聊天记录。1.使用签名cookies代替。2.检查演员id以匹配允许聊天的用户列表。让我看看它是否有效…你明天可能会收到你的赏金,因为我必须检查它是否有效。没问题。我希望它能帮助你。