将身份验证令牌传递到HTML页面

时间:2019-06-03 15:37:34

标签: html node.js

我有一个用户身份验证系统,该系统会在身份验证成功后生成访问令牌。我需要将此令牌作为标头参数传递给其他页面,以允许使用该页面。

    module.exports.authenticate=function(req,res){
        var email=req.body.email;
        var password=req.body.password;


        connection.query('SELECT * FROM org WHERE email = ?',[email], function (error, results, fields) {
          if (error) {
              res.json({
                status:false,
                message:'query error'
                })
          }else{

            if(results.length >0){
                if(bcrypt.compareSync(password, results[0].password)){

                  var access_token = jwt.sign({ id: email }, 'secretpassword123', {expiresIn: 3600});
                  var decoded = jwt.decode(access_token, 'secretpassword123');
                  var expires_in = decoded.exp-decoded.iat;
                  var token_type = "org";
                  console.log(decoded);
                  req.headers.access_token = access_token;
                  res.cookie('access-token', access_token, { expires: new Date(Date.now() + 3600)})

res.status(200).send({ auth: true, access_token: access_token, expires_in, token_type});
               }
                else{
                    res.json({
                      status:false,
                      message:"Email or password does not match"
                     });
                }

            }

            else{
              connection.query('SELECT * FROM client WHERE email = ?',[email], function (error, results, fields) {
                if (error) {
                  res.json({
                    status:false,
                    message:'query error'
                  })
                }else{
                  if(results.length >0){
                    if(bcrypt.compareSync(password, results[0].password)){
                      var access_token = jwt.sign({ id: email }, 'secretpassword123', {expiresIn: 3600});
                      var decoded = jwt.decode(access_token, 'secretpassword123');
                      var expires_in = decoded.exp-decoded.iat;
                      var token_type = "client";
                      //res.status(200).send({ auth: true, access_token: access_token, expires_in, token_type});
                      connection.query('UPDATE client SET fingerprint = ?', access_token, function(error, results, fields){
                                if(error){
                                    console.log(error);
                                }
                                else{
                                    console.log(results);
                                }
                            })
                      return res.redirect('/dashboard.html');
                    }
                    else{
                      res.json({
                        status:false,
                        message:"Email and password does not match"
                      });
                    }
                  }
                  else{
                    res.json({
                      status:false,    
                      message:"Email does not exist"
                    });
                  }
                }
              });
            }
          }
        });}

我想将access-token传递给其他页面和控制器,作为一种授权方式。

例如,这是我的get-user控制器:

module.exports.getUser = function(req,res){
    var email = req.body.email;
    req.headers.access_token = authenticate.authenticate.access_token
    connection.query('SELECT clientid, email, orgid, name, phone, type, role, fingerprint, verified FROM client WHERE email = ?', req.body.email, function(error,results, fields){
                if(error){
                    console.log(error)
                    res.redirect('/dashboard.html');
                }
                else{
                    console.log(req.headers)
                    console.log(results)
                    //res.redirect('/dashboard.html');
                    res.status(200).send(results);
                }
            })
}

我应该如何处理?

我已经取得了here的进步:

我已将res.cookie添加到身份验证模块,并且可以看到cookie存储在浏览器中。但是,当我尝试使用req.cookiesreq.signedCookies在另一页中读取cookie时,它说未定义。

我最终使用localStorage来存储令牌。按照oAuth标准,这显然不安全,但是可以。如何使用Cookie来获得与本地存储相同的功能。我需要使用身份验证模块中生成的令牌来验证其他页面中的授权。

1 个答案:

答案 0 :(得分:2)

通常使用Cookie来实现。设置cookie后,它将附加到浏览器对服务器的每个请求中。例如。如果您使用的是express之类的框架,则可以执行类似的操作

res.cookie('access-token', access_token, { expires: new Date(Date.now() + 300000), httpOnly: true })

但是实际上,这只是将“ Set-Cookie” -HTTP-Header添加到您的响应中的一种便捷方法,这会导致浏览器创建cookie:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie

顺便说一句,出于安全原因,您可能应该设置'Secure'和'HttpOnly'标志,以确保cookie仅使用TLS(HTTPS)发送,而不能被JavaScript分别读取。 “ SameSite”指令还可用于防止CSRF攻击。