运行Discord官方示例Bot时出现Bad request signature错误求助
解决Discord Bot「Bad request signature」错误
核心原因
你猜的没错,问题确实和请求体解析有关。Discord的Ed25519签名验证依赖原始请求体的字节内容,而express.json()中间件会提前把请求体解析成JSON对象,破坏了原始的字节数据,导致签名验证无法通过。
修复步骤
1. 调整中间件顺序,先保留原始请求体再验证
不要直接全局使用express.json(),而是先通过raw中间件保留原始请求体,验证通过后再手动解析成JSON:
const express = require('express'); const { raw } = require('express'); const { VerifyDiscordRequest } = require('./utils'); const app = express(); // 先以原始二进制形式接收请求体,类型指定为application/json app.use(raw({ type: 'application/json' })); // 自定义中间件:先验证签名,再解析请求体 app.use((req, res, next) => { // 用原始请求体做签名验证 if (!VerifyDiscordRequest(req)) { return res.status(401).send('Bad request signature'); } // 验证通过后,手动将原始buffer解析为JSON对象 req.body = JSON.parse(req.body.toString('utf8')); next(); }); // 后续处理交互路由 app.post('/interactions', (req, res) => { // 你的交互逻辑代码 });
2. 排查其他潜在问题
除了解析顺序,还要确认以下几点:
- 确保Discord开发者门户中配置的公钥,和代码里
VerifyDiscordRequest函数使用的公钥完全一致,没有拼写错误、多余空格或大小写问题。 - 服务器时间要和Discord的时间同步,签名包含时间戳,时间差超过5分钟会直接验证失败。
- 验证前不要对请求体做任何修改(比如编码转换、格式化),必须保持原始字节的完整性。
内容的提问来源于stack exchange,提问作者Arjun
相关产品推荐
相关产品推荐

