You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:37:11