VTRyo Blog

一歩ずつ前に進むブログ

Rails 6 × Messaging API × ngrok構成でWebhook URLの確認をしたら403 Forbiddenになった件

LINE Botを作ろうと思って、サーバサイドをRails 6、Webhook URLをngrok、という感じで採用したら思わぬ罠にしばらくハマった。ということで簡単な備忘録。

この構成はぐぐるとよくヒットするパターンだと思われる。

qiita.com

LINE BotのWebhook URLは、Botサーバのエンドポイントで、Webhookペイロードの送信先だと公式で言っている。

developers.line.biz

で、このWebhook URLにngrokで生成したURLを設定して、「Verify」で検証するわけだが403 Forbiddenが返ってきていた。

f:id:vtryo:20211106141848p:plain

Rails 6のBlocked host

LINE Developersの設定は正しいという確認をしてもらった前提で、このRails 6のBlocked hostの設定を確認しておきたい。

www.fngtps.com

config/development.rbにあるRails.application.configure doの中で

Rails.application.configure do
    #~略~
    config.hosts << ".ngrok.io"
end

のように記述すればngrokで生成したURLはブロックされなくなる。

ホストを全許可する方法もあるようだ(デフォルトでローカルホストの通信までわざわざブロックする設定にしているだけに、あまり使う気にはなれない方法)。

Rails.application.configure do
  config.hosts.clear
end

ngrokのResponseも問題なさそう

上記の設定を追加したあとは無事期待値通りの挙動。

f:id:vtryo:20211106142806p:plain

Started POST "/callback" for xxxxxxx at 2021-11-06 14:27:53 +0900
Processing by LinebotController#callback as HTML
  Parameters: {"destination"=>"xxxxxxxxxxx", "events"=>[], "linebot"=>{"destination"=>"xxxxxxxxx", "events"=>[]}}
Completed 204 No Content in 3ms (Allocations: 97)

LINEに追加したBOT(スマホ)からもメッセージを送ってみる

Started POST "/callback" for xxxxxxxxxxx at 2021-11-06 14:31:15 +0900
Processing by LinebotController#callback as HTML
  Parameters: {"destination"=>"xxxxxxxxxxx", "events"=>[{"type"=>"message", "message"=>{"type"=>"text", "id"=>"xxxxxxxxxxx", "text"=>"メッセージの内容もログに残ってるな?"}, "timestamp"=>xxxxxxxxxxx, "source"=>{"type"=>"user", "userId"=>"xxxxxxxxxxx"}, "replyToken"=>"[FILTERED]", "mode"=>"active"}], "linebot"=>{"destination"=>"xxxxxxxxxxx", "events"=>[{"type"=>"message", "message"=>{"type"=>"text", "id"=>"xxxxxxxxxxx", "text"=>"メッセージの内容もログに残ってるな?"}, "timestamp"=>xxxxxxxxxxx, "source"=>{"type"=>"user", "userId"=>"xxxxxxxxxxx"}, "replyToken"=>"[FILTERED]", "mode"=>"active"}]}}
Completed 204 No Content in 120ms (ActiveRecord: 0.0ms | Allocations: 4074)

ハマりを抜け出した!

参考

stackoverflow.com