JSONWebTokenError:JWT 在 index.js 处格式错误

Posted

技术标签:

【中文标题】JSONWebTokenError:JWT 在 index.js 处格式错误【英文标题】:JSONWebTokenError: JWT Malformed at index.js 【发布时间】:2020-05-21 16:48:11 【问题描述】:

说实话,我完全迷失了这一点。这个项目运行得非常好,我正在从我上次工作的 GitHub 推送中运行它。这就是发生的事情。我失去了整个后端。不知道怎么回事,不知道怎么回事。因此,当我从 GitHub 中提取数据时,我没有备份我的 JWT 密钥。我得到了“无效的令牌错误”(或类似的东西)。我将整个项目放在一个新的服务器/数据库上,现在我收到以下错误:

JsonWebTokenError: jwt malformed
    at Object.module.exports [as verify] (C:\Users\glove\workspace\CharityApp\backend\node_modules\jsonwebtoken\verify.js:49:17)
    at C:\Users\glove\workspace\CharityApp\backend\src\index.js:15:30
    at Layer.handle [as handle_request] (C:\Users\glove\workspace\CharityApp\backend\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\glove\workspace\CharityApp\backend\node_modules\express\lib\router\index.js:317:13)
    at C:\Users\glove\workspace\CharityApp\backend\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\Users\glove\workspace\CharityApp\backend\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\glove\workspace\CharityApp\backend\node_modules\express\lib\router\index.js:275:10)
    at cookieParser (C:\Users\glove\workspace\CharityApp\backend\node_modules\cookie-parser\index.js:71:5)
    at Layer.handle [as handle_request] (C:\Users\glove\workspace\CharityApp\backend\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\glove\workspace\CharityApp\backend\node_modules\express\lib\router\index.js:317:13)

以及它在 index.js 中引用的代码块:

const jwt = require('jsonwebtoken');
const cookieParser = require('cookie-parser');
require('dotenv').config(path: 'variables.env');
const createServer = require('./createServer');
const db = require('./db');

const server = createServer();

server.express.use(cookieParser());

// decode jwt to get user id on each request
server.express.use((req, res, next) => 
    const token = req.cookies;
    if(token) 
        const userId = jwt.verify(token, process.env.APP_SECRET);
        // put userid onto request for access
        req.userId = userId;
    
    next();
);

以及在涉及登录的 GraphQL 解析器中多次使用的签名代码。

const token = jwt.sign(userId: user.id, process.env.APP_SECRET);
    // set cookie with token
    ctx.response.cookie("token", token, 
        httpOnly: true,
        maxAge
);

应用程序机密只是从 .env 文件中提取,而 maxAge 只是 1 年 cookie 的简单常量。

这基本上是一个完成的项目。 :/ 如果有人能帮我解决这个问题,我将不胜感激。

【问题讨论】:

自从更改密码后,您是否清除了浏览器中的 cookie?如果您传递给 verify 的值是一个字符串但它实际上不是 JWT,那么您真的应该收到该错误。您可以将 req.cookies.token 的值记录到控制台,以查看它是否看起来像一个有效的 JWT。 就这么简单不是吗?哈哈,是的,我清除了 cookie,它工作正常。 :) 谢谢伙计。 控制台日志看起来像是一个包含三个部分的有效 JWT。好东西,我回来做生意了。 【参考方案1】:

当您在服务器上更改 JWT 的密钥时,您最终会使服务器之前发布的任何现有 JWT 无效。如果将 JWT 保存为 cookie,浏览器将继续提交带有现在无效 JWT 的 cookie,直到 cookie 过期或被删除。您应该 delete the cookie in question 或清除所有 cookie 以解决客户端的问题。

在这种情况下,您的秘密丢失了。不过,随着时间的推移,秘密发生变化并非没有道理。您应该确保优雅地处理无效(可能会在发生这种情况时重置 cookie),以避免在您的密码发生更改时造成糟糕的用户体验。作为用户,我可以处理返回站点并发现我已注销的情况——但是让我的所有请求无缘无故地失败会导致糟糕的时间。更好的是,您可以轮换您的秘密,跟踪前一个秘密以及当前秘密并检查两者,直到您确定任何旧 cookie 已过期。

【讨论】:

以上是关于JSONWebTokenError:JWT 在 index.js 处格式错误的主要内容,如果未能解决你的问题,请参考以下文章

JsonWebTokenError:必须提供 jwt

jwt 服务器端认证 JsonWebTokenError

JsonWebTokenError: jwt malformed: can't verify my Webtoken

为什么令牌上有JWT(JSON Web令牌)前缀?回复:JsonWebTokenError:无效令牌

错误:error:0909006C:PEMroutines:get_name:no start line

JsonWebToken 遇到问题; JsonWebToken 错误:必须提供 JWT