web-dev-qa-db-ja.com

Laravel:「users」DBテーブルの「remember_token」とは何ですか?

Usersテーブルのremember_tokenを使用して、ユーザーをアプリケーションに認証することは安全ですか?

このトークンの目的は何ですか?現在、フォームでそれを使用して、ユーザーがログインしているかどうかを確認しています。トークンが存在しない場合は、ログイン画面を表示します。ユーザーがログアウトするたびに、このトークンが再生成されます。

29
Onion

いいえ。認証に使用することは想定されていません。フレームワークによってRemember Me Cookieハイジャック。値は、ログインおよびログアウト時に更新されます。 Cookieが悪意のある人によってハイジャックされた場合、ログアウトすると、ハイジャックされたCookieは一致しなくなるため、役に立たなくなります。

次のドキュメントを参照してください。

https://laravel.com/docs/upgrade#upgrade-4.1.26

52
sidneydobber

Auth::logout()が正しく機能するためには、remember_tokenをユーザーテーブルの移行に追加する必要がありました。

remember_tokenを移行に追加しました。

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        //
        Schema::create('users', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('lname', 32);
            $table->string('fname', 32);
            $table->string('username', 32);
            $table->string('email', 320);
            $table->string('remember_token', 100);
            $table->string('password', 64);

            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
        Schema::drop('users');

    }

}

コマンドラインからusersテーブルを削除してから、移行/シードする必要があります。

7
Cyril T

これが古い質問であったとしても、必要のない場合はトークンを使用しないオプションを提示したかった(たとえば、サイトに自分のオプションを覚えていない)。

Usersテーブルにダミーの列を追加する代わりに、Auth :: logout()が設定しないようにすることができます。

これをユーザーモデルに追加するだけです(Laravel 5.6の時点で機能します):

public function save(array $options = array()) {
    if(isset($this->remember_token))
        unset($this->remember_token);

    return parent::save($options);
}

これにより、モデルが保存される直前に「remember_token」列が削除されるため、存在しない列が原因でエラーが発生することはありません。

3
LinusCDE98

Laravelは、非表示の入力に [〜#〜] csrf [〜#〜] トークンを提供し、ログインしているかどうかにかかわらず、フォームが送信されるたびに自動的に追加および検証します。 Form Builderを使用している場合、これを確認する必要もなく発生しています。

Authファサードを使用して、送信時にユーザーがログインしているかどうかを確認する必要があります。

1
DanielM