2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Docker/Laravelのpost時に419エラーがでた話

Last updated at Posted at 2021-02-05

問題

###前提

・Docker/Laravel環境で記事post時419エラーが出ました。
・ローカルのビルドインサーバ/Laravel環境では出ていませんでした。

調査

1)CSRFがformに入っているか
419エラー出るときはCSRF関連のエラーと言うことで
下記の記事にある通り、formタグに@csrfが入っていないか調べました。

しかし、変わらず出てくるという状況でした。
そもそも、ローカル環境ではできているので、ここは問題無しとしました。

  1. 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 をつけたら動作しました

----
このような問題と同様に対処しても行けるかもしれませんが要検討です
以上何かのヒントになれば

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?