Laravel:在“用户”数据库表中,“remember_token”是什么?

58

在用户表中使用 remember_token 来验证用户是否能够进入应用程序是安全的吗?

这个 token 的目的是什么?目前,我在表单中使用它来检查用户是否已登录 - 如果该 token 不存在,则显示登录屏幕。每次用户退出时,都会重新生成此 token。

5个回答

94

不,它不应该用于身份验证。它由框架用于防止“记住我”cookie劫持。该值在登录和注销时刷新。如果cookie被恶意人士劫持,注销会使劫持的cookie变得无用,因为它不再匹配。

请参考此文档:

https://laravel.com/docs/4.2/upgrade#upgrade-4.1.29


1
http://security.stackexchange.com/questions/988/is-basic-auth-secure-if-done-over-https - sidneydobber
1
OAuth 的作用是在不同域名之间安全地建立身份验证。祝好运,但请注意,不要轻视它,否则您可能会意外公开整个数据库!我花了几天的时间阅读资料和进行沙盒测试,但我仍然是个新手! :) - sidneydobber
1
  1. 使用API(OAuth使用的数据库)注册用户。
  2. 用户登录应用程序,应用程序发送令牌请求并获得它,因为用户是有效的。
  3. 用户可以使用令牌进行请求以进行验证。简而言之。 :)
- sidneydobber
1
我总是使用Postman REST客户端进行测试。https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm?hl=en - sidneydobber
1
我创建了一个聊天室,以便在正确的地方继续对话。http://chat.stackoverflow.com/rooms/51330/implement-oauth2-0-password-flow - sidneydobber
显示剩余21条评论

12

为了使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');

    }

}

你需要从命令行中删除用户表,然后进行迁移/填充。


3
想指出一个小改变 - 根据[Laravel 升级指南][http://laravel.com/docs/upgrade#upgrade-4.1.26],remember_token 应该是100而不是64 - 所以 $table->string('remember_token', 100); - SnapShot
并 ->可空() "你应该验证你的用户(或等效)表包含一个可空的、字符型的 100 字符长度 的 remember_token 列" - markdwhite

5
即使这是一个老问题,我还想提供一个选项:如果您不需要令牌(例如,在您的网站上没有记住我选项),则不要使用令牌。
而不是向用户表中添加虚拟列,您可以阻止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”列,从而防止因不存在的列而引发错误。


1
这对5.2版本也有帮助。 - adam

0

Laravel提供了一个CSRF令牌,它会自动添加到隐藏的输入框中,并在提交表单时进行验证,无论您是否已登录。如果您正在使用他们的表单构建器,则无需检查即可完成此操作。

您应该使用Auth门面检查用户是否已登录并提交。


0
为了解决注销时的rememberToken问题,在Auth/LoginController中添加以下函数:
function get_guard(){
        if(Auth::guard('web')->check()){
            return "web";
        }
        elseif(Auth::guard('manager')->check()){
            return "manager";
        }
        elseif(Auth::guard('client')->check()){
            return "client";
        }
        return "web";
    }

    public function logout(){
        $guard = $this->get_guard();
        switch ($guard) {
            case 'admin': Auth::guard('admin')->logout(); break;
            case 'web' : Auth::guard('web')->logout(); break;
            default : Auth::guard('web')->logout(); break;
        }
        return redirect()->guest(route("login"));
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接