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 malformed: can't verify my Webtoken
为什么令牌上有JWT(JSON Web令牌)前缀?回复:JsonWebTokenError:无效令牌