在Express中处理身份验证的最佳方法?

时间:2018-01-14 05:08:28

标签: node.js mongodb express passport.js

我最近看了一篇关于如何使用Express和MongoDB处理节点应用程序中的身份验证的教程。它使用会话和cookie。该教程没有讨论我的一些重要问题,例如如何处理密码重置和速率限制登录请求。在进一步搜索时,我无法找到任何好的教程或解决方案来处理我认为对每个验证的nodejs应用程序非常需要的内容。我发现JWT代币和护照作为其他选择,但我不确定这些是如何适应我刚学会的会话和cookie。我不需要使用社交媒体登录,只需要基本的电子邮件密码组合。您可以指出我的任何方向都会有所帮助。考虑到我正在处理安全问题,这些不是我想要解决的问题。我很沮丧,没有一个好的教程/解决方案可以处理验证的nodejs应用程序所需的所有主要内容。关于现在该做什么的建议?

1 个答案:

答案 0 :(得分:1)

我面对同样的问题我的自我,这就是我最终的结果(我确信它不完美,但它有效,而且我在不断变化和改进。)

<强> ANSWER

注册 -

确保提供(验证)所需的所有数据,哈希密码并将新用户保存到数据库

router.post('/register', (req, res)=>{

//data validations

//add user to database (hash password etc.)


   res.json({ok:1})
})

登录

  1. 登录时(假设您的数据存储区中已存在用户条目)我得到用户,确保它存在并且提供的密码(token \ apikey等)与数据库中的密码相匹配并将其传递给下一个中间件功能
  2. 使用来自用户的数据我生成一个JWT令牌,其中包含我有兴趣保留在JWT有效负载中的数据,并使用jsonwebtoken NPM模块进行签名。
  3. 我把它发回客户端。在客户端,我在本地保存令牌,并将其作为任何需要验证验证的请求的标题发送到我的快递应用程序。)
  4. 类似的东西:

    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});
    
    
    });
    

    请求身份验证

    1. 从请求标头中获取令牌。
    2. 使用jsonwebtoken
    3. 验证它
    4. 继续下一个功能或返回错误
    5. 路线看起来像这样:

      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中)。 希望这可以帮助。

      一些阅读材料(教程):

      1. https://scotch.io/tutorials/authenticate-a-node-js-api-with-json-web-tokens
      2. https://www.codementor.io/olatundegaruba/5-steps-to-authenticating-node-js-with-jwt-7ahb5dmyr
      3. https://medium.freecodecamp.org/securing-node-js-restful-apis-with-json-web-tokens-9f811a92bb52