【问题标题】:Creating hash/token from user email for email-verification从用户电子邮件创建哈希/令牌以进行电子邮件验证
【发布时间】:2016-03-02 12:22:35
【问题描述】:

谁能帮我解答从用户输入(电子邮件地址)创建安全令牌(或哈希)的方法。我想制作一个用于注册的电子邮件验证系统。

  • 用户使用电子邮件地址和密码注册
  • 我想创建一个唯一的 URL,并将其发送给用户(因此提出问题)
  • 我将这些(安全的)存储在一个临时表中
  • 用户通过发送的 URL 验证自己

我的问题是这个 URL 应该是什么样子。我认为我应该通过将电子邮件地址编码到其中,将 url 保存到临时表中,当用户打开链接时,我会比较两者,从而使其独一无二。如果匹配,我会将凭据移动到真实表中。

你有关于这个主题的任何好的资源吗?我在后端有nodejs。谢谢

【问题讨论】:

  • hash(mailaddress + constantsalt)
  • 谢谢,我不应该用随机盐代替吗?
  • 您也可以使用每个用户的随机盐。只要它足够长且足够随机以防止猜测,就可以了。
  • 你可以接受 Saurabh 的回答

标签: javascript node.js security web-applications


【解决方案1】:

我认为你的方法也是正确的。我已经使用 Express (REST API) 中的类似方法完成了电子邮件验证。我使用 JSON Web 令牌(jwt-simple 包)对 email_id、user_id 和 expiry_date 进行编码(用于检查在用户注册的电子邮件地址上发送的链接的有效性)。

然后将此编码数据附加到链接 示例:http://your_backend_server_link/verifyEmail/1234567890afshgdf..

   router.post('/AddUser', function(req, res, next) {
    var user = new User();
    user.name = req.body.name;
    user.email = req.body.email;
    user.is_verified = false;

    user.save(function(err,user){
       if(err){
           console.log(err);
           res.json(err);
       } else{
           console.log("User data saved");

           var transport = mailer.createTransport({
               service : "Gmail",
               auth : {
                   user : config.central_email,
                   pass : config.central_email_password
               }
           });

//           tommorow's date
           var info = {};
           info.user = user;
           info.expiry = new Date(new Date().getTime() + 24 * 60 * 60 * 1000);
           var token = jwt.encode(info,config.secret);
           console.log("http://localhost:3000/verifyEmail/" + token);

           var mailOptions = {
               from : "TEST<noreply@vysly.com>",
               to : user.email,
               subject : "Welcome to TEST",
               text : 'Visit this http://localhost:3000/verifyEmail/'+token,
               html : '<a href="http://localhost:3000/verifyEmail/'+token+'"><H2>Click on this</H2></a>'
           }
           transport.sendMail(mailOptions,function(email_err,email_data){
               if(email_err){
                   console.log(email_err);
                   res.json(email_err);
               }else{
                   console.log("Email is Sent");
                   res.json({result : 1});
               }
           });

       }
    });
});

当用户点击此链接时,从 URL 获取令牌并对其进行解码。通过将 expiry_date 与服务器的当前日期进行比较来检查链接的有效性

router.get('/verifyEmail/:token',function(req,res){
    var token = req.params.token;
    var data = jwt.decode(token,config.secret);
    console.log(new Date(data.expiry));
    console.log(new Date());
    if(new Date(data.expiry) > new Date()){
        User.findOne({ _id : data.user._id, name : data.user.name })
            .exec(function(err,user){
            if(err){
                console.log(err);
                res.json(err);
            }else if(!user){
                console.log("User not found");
                res.json({error : "User not found"});
            }else{
                console.log("User found");
                user.is_verified = true;
                user.save(function(update_err,update_data){
                    if(update_err){
                        console.log(update_err);
                        res.json(update_err);
                    }else{
                        console.log("Email is verified of user "+update_data._id);
                        res.json({result : 1});
                    }
                });
            }
        });
    }else{
        console.log("Link is expired");
        res.json({error : "Link is expired"});
    }
});

【讨论】:

  • 你用什么包做模型?创建User.js 等以便您可以使用var user = new User();
  • @JanakaRRajapaksha 这似乎是 TypeORM。
  • 是猫鼬模型的对象
猜你喜欢
  • 2014-10-07
  • 2012-07-14
  • 1970-01-01
  • 2011-11-08
  • 2017-11-08
  • 2011-03-21
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多