【问题标题】:Node js and JWT. How to save an accesstoken to the Authorization header in Node.js?节点 js 和 JWT。如何将访问令牌保存到 Node.js 中的授权标头?
【发布时间】:2021-01-09 00:33:04
【问题描述】:

我不知道以前是否有人问过这个问题,但我觉得我在互联网上搜索过,几乎没有发现任何关于该主题的内容。

我对 node 和 JWT 很陌生,但我想做的是生成一个 JWT,然后将其存储在 Authorization 标头中,以便我可以从后端访问它并将其发送到前端。它应该类似于“Authorization: Bearer TOKEN”。

我还使用护照和护照-jwt 来授权用户,所以当做类似的事情时

res.setHeader('authorization', 'Bearer' + token');

我收到此错误:错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头。因为护照可能已经重定向了响应?

当我搜索答案时,似乎大多数人只是以邮递员或休息为例,并假设我们自己会找到如何将令牌添加到标题中。我猜它很简单,但我错过了什么?

这是我的代码

postLogin = async (req, res, next) => {
    await passport.authenticate('local', { //Authenticate user
        successRedirect: '/',
        failureRedirect: '/users/login',
        failureFlash: 'Username or Password incorrect'
    })(req, res, next);

    const user = await User.findOne({ email: req.body.email });
    const token = await auth.generateAccessToken(user.toObject());

    res.setHeader('Authorization', 'Bearer ' + token); //Save accesstoken to authorization header
    console.log(headers);
}

const generateAccessToken = async (user) => {
    return new Promise((resolve, reject) => {
        jwt.sign(user, process.env.ACCESS_TOKEN_SECRET, {
            expiresIn: '30s'
        }, 
        (err, token) => {
            if (err) 
                reject(err);
            else {
                console.log(`Someone generated token: ${token}`);
                resolve(token);
            }
        });
    });
}

提前致谢:D

【问题讨论】:

    标签: javascript node.js express authentication jwt


    【解决方案1】:

    您的代码正在尝试在 Passport 本身已发送标头后设置标头。您可以传递函数来执行自定义逻辑,而不是将重定向选项作为对象传递给 passport.authenticate。见the example

    【讨论】:

    • 谢谢!不过现在还有另一个问题,因为res.setHeader('authorization', 'Bearer ' + token); 实际上似乎并没有设置标题。我无法通过req.headers.authorization 访问它,即使我在同一页面上。它有一个奇怪的范围还是我需要做其他事情来访问标题?
    • res.set(而不是setHeader)的行为方式是否相同? res.set 是 express 方法,res.setHeader 是在本机 Node 响应对象上公开该方法(res.headerres.set 相同)。
    • 是的。但是,我似乎能够通过res.getHeader('authorization') 访问标题,但前提是我与res.set()res.setHeader() 在同一页面上。我是否需要在前端或后端做一些事情,以便我可以在其他路由中访问令牌?感谢您的快速回复:D
    • 客户端是否在做任何事情来存储该授权标头,例如作为 cookie?这就是它如何在页面和请求之间保持相同的令牌。或者,服务器可以使用res.cookie 为客户端设置它,客户端可以将其cookie 转换为授权标头,或者服务器可以通过使用req.cookie 来检查令牌来完成所有工作。 expressjs.com/en/api.html#res.cookie
    • 谢谢您,非常感谢您的帮助:D
    猜你喜欢
    • 2021-07-22
    • 2020-04-28
    • 2017-11-06
    • 2021-02-09
    • 2016-03-08
    • 2015-09-27
    • 1970-01-01
    • 2018-12-18
    • 2023-03-25
    相关资源
    最近更新 更多