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

使用ngrok接收webhook时遇403 Forbidden错误,求解决方法

解决Rails Webhook本地开发的403 Forbidden问题

嘿,这个403 Forbidden问题在Rails开发Webhook时太常见了,我来帮你一步步排查解决:

  • 最核心原因:CSRF保护拦截了请求
    Rails默认开启CSRF防护来防范跨站请求伪造,但Webhook的POST请求来自第三方服务,不会携带Rails要求的CSRF令牌,所以直接被拦截了。解决方法是在你的InvoiceController里,仅对webhooks方法跳过CSRF验证:

    class InvoiceController < ApplicationController
      # 只针对webhooks方法关闭CSRF验证,避免全局关闭带来的安全风险
      skip_before_action :verify_authenticity_token, only: [:webhooks]
    
      def webhooks
        # 这里建议用request.body.read获取接收的JSON数据,response.body是你要返回的内容
        render json: request.body.read, status: 200
      end
    end
    
  • 检查路由配置的规范性
    你的路由写法可以调整得更清晰,确保POST请求正确映射到控制器方法:

    Rails.application.routes.draw do
      # GET请求可用来测试URL是否可达,POST是实际接收Webhook的路由
      get 'invoice/webhooks'
      post 'invoice/webhooks', to: 'invoice#webhooks'
    end
    

    可以运行rails routes命令确认路由是否正确生成,查看invoice/webhooks的POST路由对应的控制器和方法是否匹配。

  • 确认ngrok URL是否有效
    ngrok每次重启都会生成新的随机URL,你需要确保第三方服务里配置的Webhook URL和当前ngrok终端显示的地址完全一致。比如终端会输出类似这样的内容:

    Forwarding  https://ce0d99f7.ngrok.io -> http://localhost:3000
    

    如果ngrok重启过,一定要同步更新第三方的Webhook配置。

  • 排查其他权限拦截逻辑
    如果你的控制器里还有其他权限验证(比如Devise的authenticate_user!),也要确保webhooks方法跳过这些验证:

    skip_before_action :authenticate_user!, only: [:webhooks]
    
  • 用测试请求定位问题
    你可以用curl模拟Webhook请求,测试接口是否正常响应:

    curl -X POST https://ce0d99f7.ngrok.io/invoice/webhooks \
      -d '{"event": "invoice_updated", "data": {"id": 456}}' \
      -H "Content-Type: application/json"
    

    同时查看Rails的开发日志(log/development.log),日志里会详细说明403错误的具体触发原因,帮你精准定位问题。

内容的提问来源于stack exchange,提问作者Damien Compère

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:08:00