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

部署到Heroku后Twilio Webhook POST请求返回403错误求助

解决方案:Heroku部署后Twilio Webhook返回403错误

问题分析

本地及nGrok环境下应用能正常接收Twilio Webhook,但部署到Heroku后,Twilio触发的POST请求返回403,Postman模拟相同请求却能正常执行。结合Twilio错误提示**"跨站POST表单提交被禁止",核心原因是SvelteKit默认启用的CSRF保护拦截了Twilio请求**——Twilio的Webhook无法携带SvelteKit要求的CSRF令牌,而Postman直接提交表单的方式未触发前端CSRF校验逻辑,因此能正常通过。

解决步骤

1. 关闭目标端点的CSRF保护

在api/incomingMessages/+server.js(或.ts)文件顶部添加配置导出,禁用该端点的CSRF验证:

export const config = {
    csrf: false
};

export async function POST({ request }) {
    // 原有的POST请求处理逻辑
}

2. (可选但推荐)验证Twilio请求合法性

关闭CSRF后,为避免恶意请求,建议用Twilio官方库验证请求来源:

  • 安装依赖:npm install twilio
  • 在服务器代码中添加验证逻辑:
import twilio from 'twilio';

export const config = {
    csrf: false
};

export async function POST({ request, headers }) {
    // 从环境变量获取Twilio密钥
    const authToken = process.env.TWILIO_AUTH_TOKEN;
    const requestUrl = 'https://你的Heroku域名/api/incomingMessages'; // 替换为实际域名
    const twilioSignature = headers.get('x-twilio-signature');

    const text = await request.text();
    const params = new URLSearchParams(text);

    // 验证请求是否来自Twilio
    const isValid = twilio.validateRequest(authToken, twilioSignature, requestUrl, params);
    if (!isValid) {
        return new Response('Unauthorized', { status: 401 });
    }

    // 原有的消息处理、数据库插入等逻辑...
}

3. 重新部署到Heroku

修改代码后,提交并重新部署至Heroku,即可解决403拦截问题。

日志佐证

Heroku日志显示请求来自Twilio官方IP(54.174.11.136),但被CSRF保护拦截返回403,修改配置后该请求将正常进入你的业务处理流程。

内容的提问来源于stack exchange,提问作者Jacksonvoice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:53:15