外部API(sigfox backend cloud API)からlaravelにPOSTした際のCSRF保護エラー(419)
IoTのLPWA通信方式の一つであるsigfoxにはsigfox backend cloud APIというものがあり、そのAPIを用いると、例えば機器に接続されたsigfoxデバイスがsigfox backend cloudに送信したデバイスメッセージを取得できたりします。
この際にAWS IoTやAzure IoTなどと連携させることができるのですが、私はAWSのEC2にデプロイしたWEBサイト(laravel)とデータベース(MySQL)に直接データを送信したかったので特に連携サービスは使用していません。具体的にはcustom callbackを使用しました。
なのですが、sigfoxからデータを送ってみたところエラーを返されました。下のメッセージ(sigfox backendのMESSAGEから確認したもの)によると419エラーを返されていることが確認できます。
[ERROR]
419 - unknown status - #1POST http://〇.〇〇〇.〇〇.〇〇〇/map/add HTTP/1.0 content-length : hoge accept-encoding : gzip,deflate accept-language : fr host : 〇.〇〇〇.〇〇.〇〇〇 accept-charset : UTF-8;q=0.9,*;q=0.7 user-agent : SIGFOX content-type : application/json { "deviceId": "hogehoge", "time": hogehoge, "data":"hogehogehoge", "seqNumber": hoge, "computedLocation": {"lat":hogehoge,"lng":hogehoge,"radius":hoge,"source":hoge,"status":hoge}
}
419エラーを調べてみたところ原因は、laravelはCSRF保護がデフォルトなのにsigfoxのAPIがCSRF保護をされていないから、だそうです。
解決策は複数あるみたいですが、今回僕はsigfox backend cloud APIという外部のAPIを用いているのでAPI側にCSRF保護を付けることは無理だと思われます。そこでlaravel側のCSRF保護をsigfoxのAPIのみ除外するようにしました。
具体的にはlaravelの、
app/Http/Middleware/VerifyCsrfToken.php
にあるprotected $except部分にAPIをPOSTするURLを付け足します。
protected $except = [
'http://〇.〇〇〇.〇〇.〇〇〇/map/add', //付け足した部分
];
以上の変更によりsigfoxの通信エラーはなくなりました。
〇参考にさせていただいたサイト