【问题标题】:How to send a JWT Token to the Header in Node.js如何将 JWT 令牌发送到 Node.js 中的 Header
【发布时间】:2018-09-10 18:29:13
【问题描述】:

我正在创建一个应用程序,它将在 Node.js 上与 MySQL 一起创建用户会话。

我按照下面链接的教程操作,但在使用 JWT 令牌时遇到了问题。

如果我通过 Postman 发出 POST /registration 请求,我会收到“请发送令牌”错误。我通过搜索检查了Header,但是没有检查我在Header列表中的Authorization。

我只是按照教程进行操作,很遗憾它不起作用。

Routes/Users.js

var express = require('express');
var users = express.Router();
var database = require('../Database/database');
var cors = require('cors')
var jwt = require('jsonwebtoken');
var token;

users.use(cors());

process.env.SECRET_KEY = "devesh";

users.post('/register', function(req, res) {

    var today = new Date();
    var appData = {
        "error": 1,
        "data": ""
    };
    var userData = {
        "first_name": req.body.first_name,
        "last_name": req.body.last_name,
        "email": req.body.email,
        "password": req.body.password,
        "created": today
    }

    database.connection.getConnection(function(err, connection) {
        if (err) {
            appData["error"] = 1;
            appData["data"] = "Internal Server Error";
            res.status(500).json(appData);
        } else {
            connection.query('INSERT INTO users SET ?', userData, function(err, rows, fields) {
                if (!err) {
                    appData.error = 0;
                    appData["data"] = "User registered successfully!";
                    res.status(201).json(appData);
                } else {
                    appData["data"] = "Error Occured!";
                    res.status(400).json(appData);
                }
            });
            connection.release();
        }
    });
});

users.post('/login', function(req, res) {

    var appData = {};
    var email = req.body.email;
    var password = req.body.password;

    database.connection.getConnection(function(err, connection) {
        if (err) {
            appData["error"] = 1;
            appData["data"] = "Internal Server Error";
            res.status(500).json(appData);
        } else {
            connection.query('SELECT * FROM users WHERE email = ?', [email], function(err, rows, fields) {
                if (err) {
                    appData.error = 1;
                    appData["data"] = "Error Occured!";
                    res.status(400).json(appData);
                } else {
                    if (rows.length > 0) {
                        if (rows[0].password == password) {
                            let token = jwt.sign(rows[0], process.env.SECRET_KEY, {
                                expiresIn: 1440
                            });
                            appData.error = 0;
                            appData["token"] = token;
                            res.status(200).json(appData);
                        } else {
                            appData.error = 1;
                            appData["data"] = "Email and Password does not match";
                            res.status(204).json(appData);
                        }
                    } else {
                        appData.error = 1;
                        appData["data"] = "Email does not exists!";
                        res.status(204).json(appData);
                    }
                }
            });
            connection.release();
        }
    });
});

users.post('/login', function(req, res) {

    var appData = {};
    var email = req.body.email;
    var password = req.body.password;

    database.connection.getConnection(function(err, connection) {
        if (err) {
            appData["error"] = 1;
            appData["data"] = "Internal Server Error";
            res.status(500).json(appData);
        } else {
            connection.query('SELECT * FROM users WHERE email = ?', [email], function(err, rows, fields) {
                if (err) {
                    appData.error = 1;
                    appData["data"] = "Error Occured!";
                    res.status(400).json(appData);
                } else {
                    if (rows.length > 0) {
                        if (rows[0].password == password) {
                            token = jwt.sign(rows[0], process.env.SECRET_KEY, {
                                expiresIn: 5000
                            });
                            appData.error = 0;
                            appData["token"] = token;
                            res.status(200).json(appData);
                        } else {
                            appData.error = 1;
                            appData["data"] = "Email and Password does not match";
                            res.status(204).json(appData);
                        }
                    } else {
                        appData.error = 1;
                        appData["data"] = "Email does not exists!";
                        res.status(204).json(appData);
                    }
                }
            });
            connection.release();
        }
    });
});

users.use(function(req, res, next) {
    var token = req.body.token || req.headers['token'];
    var appData = {};
    if (token) {
        jwt.verify(token, process.env.SECRET_KEY, function(err) {
            if (err) {
                appData["error"] = 1;
                appData["data"] = "Token is invalid";
                res.status(500).json(appData);
            } else {
                next();
            }
        });
    } else {
        appData["error"] = 1;
        appData["data"] = "Please send a token";
        res.status(403).json(appData);
    }
});

users.get('/getUsers', function(req, res) {

    var appData = {};

    database.connection.getConnection(function(err, connection) {
        if (err) {
            appData["error"] = 1;
            appData["data"] = "Internal Server Error";
            res.status(500).json(appData);
        } else {
            connection.query('SELECT *FROM users', function(err, rows, fields) {
                if (!err) {
                    appData["error"] = 0;
                    appData["data"] = rows;
                    res.status(200).json(appData);
                } else {
                    appData["data"] = "No data found";
                    res.status(204).json(appData);
                }
            });
            connection.release();
        }
    });
});

module.exports = users;

Server.js

var express = require('express');
var cors = require('cors');
var bodyParser = require("body-parser");
var app = express();
var port = process.env.PORT || 3000;

app.use(bodyParser.json());
app.use(cors());
app.use(bodyParser.urlencoded({
    extended: false
}));

var Users = require('./Routes/Users');

app.use('/users',Users);

app.listen(port,function(){
    console.log("Server is running on port: "+port);
});

邮递员标题

【问题讨论】:

  • 您可以将标头中的 anything 发送到您的 Node 应用程序吗?

标签: mysql node.js jwt


【解决方案1】:

下面是我的代码。我正在使用 axios

export function Post(url, data) {
  const authHeader = initAuthHeaders();
  const config = {
    headers: {
      Authorization: "Bearer " + authHeader
    }
  };

  return axios.post(url, data, config);
}

完整的源代码可以在here找到

【讨论】:

  • axios 是一个我不熟悉的库。而且你的代码和我写的代码很不一样。这对我没有帮助T_T
  • 尝试从 users.post 转换为 axios post 就可以了
  • 你节省了我的时间,兄弟。我试图使用从教程课程中学到的名为“x-auth-token”的不同标头发送,而不是...
【解决方案2】:

在这里我添加了这个 sn-p 用于在标头中添加令牌。登录后获取令牌数据并将令牌数据添加到您的请求的标头中,例如令牌作为键和令牌数据作为值。

【讨论】:

    【解决方案3】:

    这可能对你有帮助

    middleware.loadUser= (req, res, next) => {
      const { headers } = req;
    
      if (_.isEmpty(headers.authorization)) {
        //auth error
      } else {
        const decoded = jwt.decodeAuthToken(headers.authorization.replace('Bearer ', ''));
        if (decoded) {
          User.findOne({ _id: decoded.id })
            .then((user) => {
              if (user) {
              } else {
              }
            })
            .catch((err) => {
    
            });
          req.user = decoded;
        } else {
        }
      }
    };
    

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 2020-08-21
      • 2017-01-02
      • 2020-06-08
      • 2019-01-06
      • 2023-03-27
      • 2015-02-10
      • 2019-10-23
      • 1970-01-01
      相关资源
      最近更新 更多