如何在nodejs中请求页面时设置headers?

How to set headers while requesting a page in nodejs?

我看过很多关于 jwt 身份验证的教程,但每个视频制作者都使用 Postman 来显示正在发生的事情,他们在 headers 部分传递 header,同时在 URL 中请求 URL邮差。我试着用 JavaScript 来做,但我做不到。

我想进行 jwt 身份验证,但在生成令牌后,我将其发送到客户端以用于进一步的请求,但在尝试几次后我没有这样做。我也尝试在服务器端设置 req.headers 但它没有做我想做的事..

我想为令牌生成后的每个请求设置请求 header 以验证表单 "Bearer {token}"。用JS怎么办??

我最担心的是每个教程都是用邮递员做的,但他们没有展示他们是如何在自己的应用程序中实现它的。我希望我的问题很清楚。

类似的东西:

$.ajax({
  url: url,
  beforeSend: function(xhr) {
    xhr.setRequestHeader("custom_header", "value");
  },
  success: function(data) {
  }
});

您可以像那样在您的 http 请求中轻松添加 header

这里已经解决了Node.JS: How to send headers with form data using request module

首先使用 npm 安装 jwt 和 express 框架,然后制作一个中间件文件,该文件将检查是否设置了 tokek。

Middleware.js :

let jwt = require('jsonwebtoken');
const config = require('./config.js');

let checkToken = (req, res, next) => {
    let token = req.headers['authorization']; // Express headers are auto converted to lowercase

    if (token) {
        if (token.startsWith('Bearer ')) {  // Checks if it contains Bearer
            // Remove Bearer from string
            token = token.slice(7, token.length); //Separate Bearer and get token
        }

        jwt.verify(token, config.secret, (err, decoded) => {  //Inser the token and verify it.
            if (err) {
                return res.json({
                    status: false,
                    message: 'Token is not valid'
                });
            } else {
                req.decoded = decoded;
                next();
            }
        });
    } else {
        return res.json({
            status: false,
            message: 'Access denied! No token provided.'
        });
    }
};

接下来,创建一个包含机密的配置文件。

配置 js:

module.exports = {
    secret: 'worldisfullofdevelopers'
};

最后,创建一个令牌路由,它将创建您的令牌,之后其余调用将针对该令牌进行身份验证。

Index.js :

const middleware = require('./middleware');
const jwt = require("jsonwebtoken");
const config = require('./config.js');

//Call token Route
app.use('/token', (req, res, next) => {

    //Generate Token
    let token = jwt.sign({ username: "test" },
        config.secret,
        {
            expiresIn: '1h' // expires in 1 hours
        }
    );

    //Send Token
    res.json({
        success: true,
        message: 'Authentication successful!',
        token: token
    });

});

//Add Authentication to all routes
app.use(middleware.checkToken);

//===> All the routes after middleware will be checked for token

app.use('/getUser', (req, res, next) => {; 
 console.log('do something')
});

在普通 nodejs 中:

const uri = "http://example.com";

const options = {
    headers: {
        "Authorization": "Bearer ...."
    }
}

// require http/https lib
let req = require("http").request(uri, options, (res) => {

    const chunks = [];

    res.on("data", function (chunk) {
        chunks.push(chunk);
    });


    res.once("end", () => {

        // concat body chunks
        let body = Buffer.concat(chunks);
        console.log(body.toString());

    });


});

req.on("error", (err) => {
    console.log(err);
});

req.end();

https://nodejs.org/dist/latest-v12.x/docs/api/http.html#http_http_request_options_callback

如果我没理解错的话,您想在客户端设置 HTTP header,以便将身份验证令牌传递给服务器。我建议您使用像 **axios* 这样的库。

使用 axios,收到令牌后,使用以下代码行为每次传出通信设置 header:

axios.defaults.headers.common['Authorization'] = "Bearer " + token;

这会将身份验证 http header 设置为您需要的形式。