【问题标题】:Node.JS Express to HTML data transferNode.JS Express 到 HTML 数据传输
【发布时间】:2016-02-21 00:48:45
【问题描述】:

我正在使用 node.js 创建一个登录应用程序,我似乎在将字符串从服务器传输到 html 方面遇到了知识不足。

我在jsfiddle 发布了我当前的代码。 我的应用程序验证 mysql 表的凭据,然后生成一个包含用户名密码和用户 IP 地址的基本令牌。

在最后一段代码中,客户端 html 发布到服务器,我有两个部分,您可以看到发送到基本用户页面和发送到管理页面。 我试图研究这个主题,但我没有得到任何与这种情况相关的信息。任何人都可以指导我在发送令牌的同时将用户发送到管理员或用户页面的正确方向吗?

同样,express服务器如何向客户端发送数据,例如 在页面上,我希望数据库保存有关用户的相关信息,例如地址和电话号码。这些信息如何通过html从服务器传输到客户端?

app.post('/', urlencodedParser, function (req, res) {

var date = new Date();
con.query("SELECT * from users WHERE username=" + con.escape(req.body.username) + " AND password=" + con.escape(req.body.password), function (err, rows, fields) {
    if (err) {
        console.log(err);
    } else {
        var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
        if (rows == '' && rows == '') {
            console.log('User Failed to login to the server with @'.red + con.escape(req.body.username) + ':' + con.escape(req.body.password));
            res.sendFile(__dirname + '/admin/failure.html');

        } else {
            var isadmin = rows[0].admin;
            var cryptomap = [req.body.username + ',' + req.body.password + ',' + ip];
            var strcryptomap = cryptomap.toString(); // convert array to string
            var token = encrypt(strcryptomap);
            console.log(token + ' SENT'.red);
            var backto = decrypt(token); //decr
            var arr = backto.toString().split(","); // SPLITTING STRING TO SATISFY /VERIFY *************************************************
            console.log(arr[0] + ' has valid token, encryption succsessful'.green);
            con.query('UPDATE users SET crypto=' + con.escape(token) + 'WHERE username=' + con.escape(req.body.username), function (err, rows, fields) {
                if (err) {

                    res.send(500);


                } else {

                    console.log('Updated Crypto for ' + req.body.username);
                    if (isadmin == 0) {
                        // send to basic user page 
                        res.send('USER');
                    } else {

                        //send to admin user page
                        res.sendto('http://google.com/?' + token);
                    }
                }
            });
        }
    }



   });
   });

【问题讨论】:

    标签: javascript html mysql node.js


    【解决方案1】:

    首先,我将回答您提出的实际问题。

    我通常处理您想要完成的事情的方式是使用来自前端的 ajax POST 和用户凭据(当然是 https,永远不要使用 http 发送凭据),让服务器对用户进行身份验证,创建令牌并使用令牌响应 ajax 帖子。从这里开始,如果身份验证成功并且服务器以令牌和您想要获取的任何其他信息进行响应,那么您有一些存储它的选项,我个人使用 cookie。存储令牌后,让前端处理重定向。

    说了这么多,我肯定会阅读身份验证原则以及您的系统可能受到攻击的不同方式。我看到一些危险信号涉及非常基本的身份验证想法/策略。

    编辑:这是一个示例 AJAX 发布到登录 API 端点,该端点以令牌响应并将用户名和令牌保存到 cookie。显然,成功函数中的结果数据的组织方式可能与我的不同,但可以以相同的方式访问。您可以在此结果对象中发送您想要的任何数据并相应地重定向

    var loginData = { 
      username : $('#loginUsername').val(), 
      password : $('#loginPassword').val() 
    } 
    
    
    $.ajax({ 
      type : "POST", 
      url : [your-endpoint-url],
      data : loginData , 
      success : function(result) { 
          setCookie('appUN', result.username); 
          setCookie('appTok', result.token); 
          location.href = '/dashboard'; 
      }, 
      error : function(result) { 
        location.href = '/login/Error'; 
      } 
    });
    
    
    function setCookie(cname, cvalue) { 
      var d = new Date(); 
      d.setTime(d.getTime() + 10800000); 
      var expires = "expires="+d.toUTCString(); 
      var path = "path=/"; 
      document.cookie = cname + "=" + cvalue + "; " + expires + ";" + path; 
    } 
    

    要实际将数据从服务器发送回客户端,在您的 API 端点中,您将执行所有逻辑来检查用户凭据,如果他们的凭据有效,您可以创建一个令牌并返回类似

    res.json({ 
      username: username, 
      token: token
    }); 
    

    并且这个 JSON 对象将在如上所示的成功函数中可用。

    如果用户凭据无效,您可以返回类似

    res.status(400).json({Message : "The username or password is incorrect"});
    

    并且由于 400 状态,它会被你的 AJAX 请求的错误函数捕获

    【讨论】:

    • 好的,你有开始的链接吗?我的谷歌搜索总是出现与发布 FROM html 未接收数据相关的内容。 google.com/…
    • 您是否正在寻找一个好的起点来解决有关将令牌/数据传递给客户端的初始问题?还是用于令牌身份验证策略?
    • 将令牌/数据传递给客户端
    • 我将编辑我的原始答案以包含一个示例
    猜你喜欢
    • 2019-02-05
    • 1970-01-01
    • 2018-05-14
    • 2018-01-13
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 2013-12-02
    相关资源
    最近更新 更多