为什么ngrok向我发送403 Forbidden?

11

我尝试使用Webhook获取JSON数据, 我了解到应该安装ngrok,因为Webhook无法在本地工作,所以我安装了ngrok, 并尝试按照此小教程进行操作:https://medium.com/@derek_dyer/rails-webhooks-local-development-7b7c755d85e3

我创建了我的路由:

get 'invoice/webhooks'
post 'invoice/webhooks' =>'invoice#webhooks'

我的控制器:
def webhooks
   render json: response.body, status: 200
end

我还把我的网址:https://ce0d99f7.ngrok.io/invoice/webhooks 插入到我的服务中,以接收Webhook。
我在终端中运行了命令:./ngrok http 3000,然后我收到了一条消息。
POST /invoice/webhooks         403 Forbidden

有人知道如何修复这个问题吗?


你提到的“message”是来自ngrok的输出,对吧?我认为它按预期工作——只是将请求转发给应用服务器。我会检查应用服务器的错误日志/控制台输出以获取有关错误的更多上下文... - Konstantin Strukov
感谢您的回答!是的,这个消息来自我启动ngrok的控制台! - Damien Compère
在 before_action 回调中,控制器上是否有任何身份验证? - Shishir
没有什么,我做了一些修改,现在在POST /invoice/webhooks上返回了422 Unprocessable Entity。 - Damien Compère
在我的控制器中添加了 skip_before_action :verify_authenticity_token,问题得到了解决,现在我的 POST /invoice/webhooks 返回 200 OK。 - Damien Compère
2个回答

32
如果你在使用Rails 6并且在开发中使用ngrok,你需要编辑config/environments/development.rb文件添加config.hosts << "a0000000.ngrok.io",其中a0000000.ngrok.io是由ngrok提供的URL,不带https://。如果这不能正常工作,则必须在你的控制器中添加skip_before_action :verify_authenticity_token

我在我的.env文件中设置了ngrok隧道地址以进行本地测试,因此在我的development.rb文件中,我只需添加config.hosts << ENV['NGROK_TUNNEL_ADDRESS']。这样,当我启动新的ngrok会话时,我就不需要修改development.rb文件,只需修改.env文件即可。 - australis
1
没有使用 HTTPS 是我的问题所在,谢谢! - Jeffrey Kozik

4

@daniel0318提供的答案完全正确。我只想提一下,您可以使用这个正则表达式来允许所有流量通过ngrok(添加到development.rb):

# /config/environments/development.rb

config.hosts << /.*\.ngrok\.io/

重新启动您的服务器,然后它就可以工作。

最后需要注意的是:多年来,ngrok已经多次更改其URL; 确保您拥有上面最新的正则表达式(其他正则表达式可能无法使用)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接