为啥 ngrok 向我发送 403 Forbidden

Posted

技术标签:

【中文标题】为啥 ngrok 向我发送 403 Forbidden【英文标题】:Why ngrok send me a 403 Forbidden为什么 ngrok 向我发送 403 Forbidden 【发布时间】:2020-04-12 05:08:27 【问题描述】:

我尝试使用 webhook 来获取 JSON, 我读到我应该安装ngrok,因为webhooks在本地不起作用,所以我安装了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

我还在我的服务中插入了我的 URL:https://ce0d99f7.ngrok.io/invoice/webhooks 以接收 webhook

我在终端中运行 ./ngrok http 3000 并收到一条消息

POST /invoice/webhooks         403 Forbidden

有人知道怎么解决吗?

【问题讨论】:

您提到的“消息”来自 ngrok 的输出,对吧?我会说它按预期工作 - 只是将请求转发到应用服务器。我会检查应用服务器错误日志/控制台输出以获取有关错误的更多上下文... 感谢您的回答!是的,消息来自我启动 ngrok 的控制台! 在 before_action 回调中控制器上是否有任何类型的身份验证? 没什么,我做了一些修改,现在我有一个用于 POST /invoice/webhooks 的 422 Unprocessable Entity 在我的控制器中添加了 skip_before_action :verify_authenticity_token 解决了这个问题,我现在在我的 POST /invoice/webhooks 上有 200 OK 【参考方案1】:

如果您使用 rails 6 并在开发中使用 ngrok,则必须编辑 config/environments 中的 development.rb 文件以添加 config.hosts << "a0000000.ngrok.io" 其中 a0000000.ngrok.io 是 ngrok 提供的 url 没有 https:// ,如果这没有工作,所以你必须在你的控制器中添加skip_before_action :verify_authenticity_token

【讨论】:

【参考方案2】:

@daniel0318 的回答完全正确。我只是想提一下,您可以使用this regular expression 来允许所有流量通过ngrok(添加到development.rb):

# /config/environments/development.rb

config.hosts << /[a-z0-9-]+\.ngrok\.io/

重新启动您的服务器,它就会工作。

最后一点:如果您认为您已经有了这个正则表达式,请仔细查看,因为 ngrok URL 格式在过去几个月中发生了变化,现在包含- 字符。 Tl;博士,config.hosts &lt;&lt; /[a-z0-9-]+\.ngrok\.io/ 有效,但旧的正则表达式:config.hosts &lt;&lt; /[a-z0-9]+\.ngrok\.io/(相同但不允许破折号)不起作用!

【讨论】:

以上是关于为啥 ngrok 向我发送 403 Forbidden的主要内容,如果未能解决你的问题,请参考以下文章

Facebook Messenger 平台 ngrok

为啥 spring-saml-extension 和 adfs 2.0 返回 403 错误?

在 centOS 上运行 phpmyadmin - 禁止错误 (403)

Django 在发送 POST 请求时返回 403 错误

向 Firebase https onRequest 云函数发送 webhook 请求得到 403 响应

为啥我的机器人的 message.js 一直向我发送相同的错误,我该如何解决?