進捗どうでしょう

主な話題は 社会人生活/情報工学/アニメ/ライトノベル/漫画/映画/自炊 などです。

MENU

外部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 - #1
POST 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のAPICSRF保護をされていないから、だそうです。

 解決策は複数あるみたいですが、今回僕は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の通信エラーはなくなりました。

 

〇参考にさせていただいたサイト

Error 302 ?? Callback ?? - Laravel France

CSRF保護 5.8 Laravel