当前位置: 首页 > 知识库问答 >
问题:

响应标头中未设置 JWT 令牌

宦树
2023-03-14

我有以下函数,它通过创建响应标头来验证用户:

function authenticateUser(res, id) {
    const payload = {
        id
    }
    const token = jwt.sign(payload, config.JWT_KEY, {
        expiresIn: '24h'
    })
    res.set('authorization', token)
    res.redirect('/user/profile')
    res.end()
}

但是,当我重定向到 /user/profile 时,它会为授权标头输出未定义:

controller.checkAuthorizaion = (req, res, next) => {
    const token = getJWTToken(req)
    console.log(token);
    if(!token) 
        Router.redirect(res, '/', 401)
    else {
        jwt.verify(token, config.JWT_KEY, (err, data) => {
            if(err)
                Router.redirect(res, '/', 401)
            else  {
                res.userId = data.id
                next()
            }
        })
    }
}

为什么它不起作用?如何将我的 jwt 令牌发送回客户端?我以为 jwt.sign() 会自动发送它。

共有2个答案

鲁城
2023-03-14

>

  • 授权是一个请求标头。它不应该在响应中使用,我认为大多数浏览器都会在响应中忽略此标头。

    您正在向浏览器发送重定向响应。浏览器读取该响应,并向 /user/profile 终结点发送新请求。浏览器不会自动将授权标头添加到您的请求中。

    如果将原始请求作为 AJAX 调用发送,则必须确保您使用的客户端(例如 axios)在将另一个请求发送到重定向到的终结点之前从响应中读取授权标头。我还没有检查过,但我很确定像 axios 这样的 JS 客户端会忽略响应中的授权标头,并且不会自动将其复制到另一个请求中。

    除此之外,@Anatoly有一些关于调用异步函数的有效观点,所以也看看。

    如何将我的 jwt 令牌发送回客户端?我以为 jwt.sign() 会自动发送它。

    通常,您在响应正文中发送令牌,并让您的客户端读取正文并将令牌存储在某个地方 - 内存、本地存储等中。另一种解决方案是将令牌存储在 cookie 中,但这仅在您已经拥有使用该令牌调用的后端时才有效。(如果您确实拥有后端,那么实际上使用访问令牌是没有意义的。你可以只使用普通的HTTP会话。

  • 范兴文
    2023-03-14

    如果你使用jsonwebtoken,那么你需要调用它作为异步函数或提供一个回调:

    async function authenticateUser(res, id) {
        const payload = {
            id
        }
        const token = await jwt.sign(payload, config.JWT_KEY, {
            expiresIn: '24h'
        })
        res.set('authorization', token)
        res.redirect('/user/profile')
        res.end()
    }
    

    getJWTToken(req) 也应该被称为异步的:

    controller.checkAuthorizaion = async (req, res, next) => {
        const token = await getJWTToken(req)
        console.log(token);
    

    当然,在getJWTToken中:你也应该调用jwt.verify作为异步函数。

     类似资料:
    • 我正在尝试使用JWT身份验证设置一个简单的Angularjs应用程序。 我给新注册的用户发了一封带有jwt令牌链接的邮件,以验证该邮件是否存在。链接如下所示: < code > http://127 . 0 . 0 . 1:3000/verify email/eyj 0 exaioijkv 1 qilchbgcioijiuzi 1 nij 9 . eyj 1c 2 vytmftzsi 6 injp

    • 我在请求处理程序周围编写了一种包装器,使它们流式传输HTTP响应。我现在得到的是 处理程序响应包装器: 控制器: 我所做的只是每隔半秒发送一个空字符串,以保持请求的活动状态。某些工具需要在超时时不关闭它。这里的问题是,我在响应中没有看到任何内容类型头。尽管我从我的控制器方法返回ResponseEntity,但什么都没有,正如这条线程中所说: https://github.com/spring-pr

    • 问题内容: 我正在开发DJANGO + AngularJS应用程序,其中django不提供角度部分。 我将角度设置如下: 然后,在执行任何POST之前,我执行GET以设置cookie。我可以通过Chrome确认已设置Cookie: (在Chrome开发者工具的resources / cookies / localhost中可见) 但是,当我执行POST时,没有设置标头 这是Chrome记录的POS

    • 问题内容: 我知道这个问题已经问过几次了。 但是,我无法获得这些解决方案。 我正在运行标准安装的node.js和socket.io。(来自Amazon EC2上的yum) 问题是Chrome退回到xhr轮询,并且这些请求需要有效的CORS配置。但是,我似乎无法正常工作。我的Web服务器在端口80上运行,而node.js(socket.io)在端口81上运行。如您所见,我试图使socket.io使用

    • 在HttpServletResponse接口中定义了若干设置HTTP响应消息头的方法,如addHeader方法可以添加响应消息头字段;addIntHeader方法可以添加整数值的响应消息头字段;setContextType方法可以设置Context-Type字段值。 HTTP响应消息头是由若干key-value对组成的,其中key表示字段名,value表示字段值,中间用冒号(:)分隔。如下面的内容

    • 问题内容: 这是我的代码: 但是,当我从浏览器向服务器发出请求时,出现此错误: 我也尝试过这种方法,在请求之后设置响应头: 没有骰子。我犯了同样的错误。有没有一种方法可以只在route函数中设置响应头?这样的事情将是理想的: 但我还是找不到这样做。请帮忙。 编辑 如果我使用POST请求卷曲URL,如下所示: 我得到这个回应: 有任何想法吗? 问题答案: 你可以很容易地做到这一点: 查看和 但是有些

    • 我的后端是sprin引导应用程序,前端是vue js 但是cookie值没有设置在请求头部和所有其他api失败与身份验证问题,因为cookie值(会话ID)不存在于头部 样本响应头部与set-cookie身份验证 下面是我在vue.config.js中的代理配置 这是我的axios实例创建与"with凭据:真" 下面是我在服务器端的web安全配置 注意:这在邮递员中工作,因为邮递员会自动将cook

    • 问题内容: 我需要将CORS设置为在express服务的脚本上启用。如何为公共/资产在这些返回的响应中设置标题? 问题答案: npm上至少有一个中间件用于处理Express中的CORS:cors。[请参阅@mscdex答案] 这是从ExpressJS DOC 设置自定义响应头的方法 将标题字段设置为值 或传递一个对象以一次设置多个字段。 别名为