問題
###前提
・Docker/Laravel環境で記事post時419エラーが出ました。
・ローカルのビルドインサーバ/Laravel環境では出ていませんでした。
調査
1)CSRFがformに入っているか
419エラー出るときはCSRF関連のエラーと言うことで
下記の記事にある通り、formタグに@csrf
が入っていないか調べました。
しかし、変わらず出てくるという状況でした。
そもそも、ローカル環境ではできているので、ここは問題無しとしました。
- sessionのファイル保存がされていないか
問題はここにありました。
Laravelの.env
ファイルにSESSION_DRIVER=file
という項目があります。
SESSION_DRIVER=file
にしているとstorage
ディレクトリに
sessionファイルが保存されるようになっています。
このままだと、Dockerの環境でCSRFのtokensession
sessionとCookieに関しては下記のサイトを参考にさせていだきました。
Docker内に保存することできないので、.env
を下記のように変更しました。
.env
- SESSION_DRIVER=file
+ SESSION_DRIVER=database #sessionsファイルをdatabaseに保存するようにする。
そして、データベースにsessionsテーブルを作成してデータベースににcsrfのtokernを(payload)を保存するようにしました。
crate_sessions_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSessionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->foreignId('user_id')->nullable()->index();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->text('payload');
$table->integer('last_activity')->index();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('sessions');
}
}
```
そして、マイグレーションします。
```
php migrate
```
これでDocker/Laravel環境で419エラーでなくなりました。
###考察
Dockerでは、一時保存するファイルに関する処理があるときは、
Docker内での書き込み設定が必要になってくるので、
そこについて調べて対応することが求められてくると思います。
##追記(2021/2/11)
別件のECSにデプロイする際に、php-fpmでユーザー権限が問題になることがありました。
php-pmでのユーザー権限とphp-fpmのユーザー権限の問題もあると思います。
---- ECSでデプロイしてもエラーになる ----
*** Nginx, php-fpmで500のエラーが出ていた***
EC2からコンテナの中にあるログファイルを確認したところ、 /var/www/public への権限エラーが出ていた
権限エラーを追っていくと、 /var/www/public は root がオーナーになっているが、phpを実行しているユーザのIDは 33 だった
EC2側で ps aux | grep php などで確認
/etc/passwd を見たところ、33のユーザIDは www-data ユーザだった
DockerfileのCOPYに --chown=www-data:www-data をつけたら動作しました。
----
このような問題と同様に対処しても行けるかもしれませんが要検討です。
以上、何かのヒントになれば。