LINE Botを作ろうと思って、サーバサイドをRails 6、Webhook URLをngrok、という感じで採用したら思わぬ罠にしばらくハマった。ということで簡単な備忘録。
この構成はぐぐるとよくヒットするパターンだと思われる。
LINE BotのWebhook URLは、Botサーバのエンドポイントで、Webhookペイロードの送信先だと公式で言っている。
で、このWebhook URLにngrokで生成したURLを設定して、「Verify」で検証するわけだが403 Forbiddenが返ってきていた。
Rails 6のBlocked host
LINE Developersの設定は正しいという確認をしてもらった前提で、このRails 6のBlocked hostの設定を確認しておきたい。
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も問題なさそう
上記の設定を追加したあとは無事期待値通りの挙動。
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)
ハマりを抜け出した!