我最近看了一篇关于如何使用Express和MongoDB处理节点应用程序中的身份验证的教程。它使用会话和cookie。该教程没有讨论我的一些重要问题,例如如何处理密码重置和速率限制登录请求。在进一步搜索时,我无法找到任何好的教程或解决方案来处理我认为对每个验证的nodejs应用程序非常需要的内容。我发现JWT代币和护照作为其他选择,但我不确定这些是如何适应我刚学会的会话和cookie。我不需要使用社交媒体登录,只需要基本的电子邮件密码组合。您可以指出我的任何方向都会有所帮助。考虑到我正在处理安全问题,这些不是我想要解决的问题。我很沮丧,没有一个好的教程/解决方案可以处理验证的nodejs应用程序所需的所有主要内容。关于现在该做什么的建议?
答案 0 :(得分:1)
我面对同样的问题我的自我,这就是我最终的结果(我确信它不完美,但它有效,而且我在不断变化和改进。)
<强> ANSWER 强>:
注册 -
确保提供(验证)所需的所有数据,哈希密码并将新用户保存到数据库
router.post('/register', (req, res)=>{
//data validations
//add user to database (hash password etc.)
res.json({ok:1})
})
登录:
类似的东西:
router.post('/login', getUser, (req, res)=>{
//getUser finds the user and attaches it to the req object
//put whatever you want in payload
let payload = {username: req.user.name, uid: req.user.uid, role: req.user.role};
let token = jwt.sign(payload, <secretOrKey>,
{expiresIn: 60 * 60 * 24 * 7});
res.json({ok: 1, token: token});
});
请求身份验证
路线看起来像这样:
req.get(`some/request/that/needs/auth`, isAuthenticated, (req,res)=>{
//do what ever...
});
isAuthenticated:
//---isAuthenticated
function isAuthenticated(req, res, next){
const token = req.headers['<jwt token bearer>'];
jwt.verify(token, 'your secret', function(err, decoded) {
if (err){next(err)}
else {
req.user = decoded;
next();}
});
}
最后一点说明:
我知道这远非完美。对我而言,这仍然是一项尝试创建“最佳实践”身份验证机制的工作。 我写这个答案作为初学者开发者(比如我自己)的参考,试图提供关于这个用例的一般概述(在expressJS中)。 希望这可以帮助。
一些阅读材料(教程):