Twilio处理入站SMS触发Django 403 CSRF校验失败如何解决?
问题原因
这个403错误是Django默认启用的CSRF防护机制拦截了Twilio的请求导致的。第三方服务发起的webhook回调请求既不会携带你站点的CSRF令牌,也不会携带符合要求的Referer请求头,因此会被Django的CSRF中间件直接拦截。
解决方案
不要关闭全站的CSRF中间件(会导致整个站点出现CSRF安全风险),仅对Twilio回调的专属视图进行CSRF豁免即可,操作方法如下:
- 首先导入CSRF豁免装饰器:
from django.views.decorators.csrf import csrf_exempt
- 如果是函数视图,直接给对应处理Twilio回调的视图加装饰器:
@csrf_exempt def twilio_sms_webhook(request): # 你的业务逻辑 ...
- 如果是类视图,需要在路由配置中添加豁免:
from django.urls import path from .views import TwilioSmsWebhookView urlpatterns = [ path('sms/webhook/', csrf_exempt(TwilioSmsWebhookView.as_view()), name='twilio_sms_webhook'), ]
补充安全建议
豁免CSRF后建议增加Twilio请求签名校验,确保请求确实来自Twilio而非恶意第三方:Twilio发起请求时会携带X-Twilio-Signature请求头,你可以使用Twilio官方SDK对该签名进行校验,校验通过后再执行业务逻辑即可。
内容的提问来源于stack exchange,提问作者giaggi
相关产品推荐
相关产品推荐

