Discord交互端点设置遇验证失败问题求助
Discord交互端点验证失败问题排查
问题详情
我正在配置Discord交互端点,但始终无法通过验证。当前使用的Django代码如下:
@csrf_exempt def discord_endpoint(request): return JsonResponse({'type':1})
收到的验证错误提示:
Validation errors:
interactions_endpoint_url: The specified interactions endpoint url could not be verified.
Discord发送到我的Django应用的POST请求内容(已转译转义字符):
{"application_id":"...","entitlements":[],"id":"...","token":"...","type":1,"user":{"avatar":"...","avatar_decoration":null,"discriminator":"0","global_name":"...","id":"...","public_flags":0,"username":"nickname"},"version":1}
解决步骤
确认请求解析与响应格式
Discord发送的是JSON格式POST请求,Django默认不会自动解析这类请求体,需要手动读取并解析。同时要确保响应的Content-Type是application/json(Django的JsonResponse会自动设置,但要确认没有被中间件修改)。修改后的基础代码:import json from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt def discord_endpoint(request): if request.method == 'POST': try: data = json.loads(request.body) if data.get('type') == 1: return JsonResponse({'type': 1}) except json.JSONDecodeError: pass return JsonResponse({'error': 'Invalid request'}, status=400)必须验证Discord请求签名
这是验证失败的核心原因之一,Discord要求端点必须验证请求签名才能通过审核。需要安装pynacl库处理签名验证,代码示例:import json import nacl.signing import nacl.encoding from django.http import JsonResponse, HttpResponseForbidden from django.views.decorators.csrf import csrf_exempt # 替换为你的Discord应用公钥,在开发者后台获取 DISCORD_PUBLIC_KEY = "你的应用公钥" @csrf_exempt def discord_endpoint(request): # 提取签名相关头信息 signature = request.headers.get('X-Signature-Ed25519') timestamp = request.headers.get('X-Signature-Timestamp') body = request.body.decode('utf-8') if not signature or not timestamp: return HttpResponseForbidden() # 验证签名 try: verify_key = nacl.signing.VerifyKey(DISCORD_PUBLIC_KEY, encoder=nacl.encoding.HexEncoder) verify_key.verify(f"{timestamp}{body}".encode('utf-8'), signature=signature, encoder=nacl.encoding.HexEncoder) except nacl.exceptions.BadSignatureError: return HttpResponseForbidden() # 处理PING请求 data = json.loads(body) if data.get('type') == 1: return JsonResponse({'type': 1}) return JsonResponse({'error': 'Unsupported request type'}, status=400)检查端点公网可达性
Discord的验证请求需要能访问到你的端点,确保服务部署在公网服务器,或者用工具(如ngrok)临时暴露本地服务,同时确认端口、路由没有被防火墙或反向代理拦截。确认CSRF豁免生效
确保@csrf_exempt装饰器直接应用在视图函数上方,没有缩进错误;如果是基于类的视图,需要装饰dispatch方法。
内容的提问来源于stack exchange,提问作者laxmymow
相关产品推荐
相关产品推荐

