【问题标题】:How to set headers while requesting a page in nodejs?在nodejs中请求页面时如何设置标题?
【发布时间】:2020-03-29 20:26:23
【问题描述】:

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

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

我想为生成令牌后的每个请求设置请求标头,用于“承载 {token}”形式的身份验证。用JS怎么做??

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

【问题讨论】:

  • 您是尝试发出 http 请求还是希望使用 JWT 保护服务器上的路由?
  • 其实是想发送headers来访问安全路由

标签: javascript node.js authentication jwt request-headers


【解决方案1】:

您可以像这样轻松地在您的 http 请求中添加标头

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

【讨论】:

  • nodejs中不存在fetch
  • 我想根据请求通过客户端发送标头。所以 fetch 始终是一种选择
【解决方案2】:

在普通的 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

【讨论】:

    【解决方案3】:

    类似的东西:

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

    【讨论】:

    • 1) 使用 jQuery 而不是普通的 JS,2) OP 要求特定于节点
    【解决方案4】:

    首先使用 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')
    });
    

    【讨论】:

    • 您如何使用生成的令牌(您在 json 中响应)设置标题授权?
    • 你的前端框架是什么?还是你想用后端 nodejs 设置它
    • 我在那个项目中特别使用了 vanilla JS
    • 您可以使用 ajax 从前端设置它
    【解决方案5】:

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

    使用 axios,在收到令牌后,使用以下代码行设置每次传出通信的标头:

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

    这会将身份验证 http 标头设置为您需要的表单。

    【讨论】:

    • 我在生成令牌后尝试执行此操作,但在再次发出请求时无法看到标头..
    猜你喜欢
    • 2020-12-22
    • 2015-01-04
    • 2020-03-10
    • 1970-01-01
    • 2019-06-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    相关资源
    最近更新 更多