remember_token是如何由laravel自动生成的?我们可以在 codeigniter 中做同样的事情吗?

How remember_token is generated by laravel automatically? Can we do the same in codeigniter?

我是 MVC 新手。谁能告诉我 remember_token 的函数写在 laravel 的什么地方? 我在 Bluprint 中看到并找到了这个函数:

public function rememberToken()
{
  return $this->string('remember_token', 100)->nullable();
}

这只是一个在数据库中定义字段的函数。我也在 Contracts/Auth/Authenticable.php 中看到,但在这里我也发现了一堆接口以及 getremembertoken 和 setremembertoken 定义为:

interface Authenticatable
{
  public function getRememberToken();
  public function setRememberToken($value);
  public function getRememberTokenName();
}

为生成保存在数据库中的令牌而编写的实际函数在哪里?谁能告诉我吗?我可以在codeigniter中实现类似的功能吗?

Yes you can do this in CodeIgniter Also

打开你的application/config/config.php

// Default $config['csrf_protection'] = FALSE; change and set TRUE

$config['csrf_protection'] = FALSE;
// Change it To
$config['csrf_protection'] = TRUE;

$config['csrf_token_name'] = 'csrf_token'; // The token name
$config['csrf_cookie_name'] = 'csrf_cookie_name'; // The cookie name
$config['csrf_expire'] = 7200; // The number in seconds the token should expire.
$config['csrf_regenerate'] = FALSE; // Regenerate token on every submission
$config['csrf_exclude_uris'] = array(); // Array of URIs which ignore CSRF checks

您可以通过安全获取 CSRF 令牌名称和值 class:

$this->security->get_csrf_hash();
$this->security->get_csrf_token_name();

您可以在 system/core/Security.php306, 319

中找到此函数

Laravel 中的记忆标记在需要时创建(例如,当用户注册并单击 "remember me" 按钮时。发生这种情况时,默认脚手架将调用 AuthenticatesUsers::attemptLogin方法:

protected function attemptLogin(Request $request)
{
    return $this->guard()->attempt(
        $this->credentials($request), $request->has('remember')
    );
}

默认的 guard 在 "attempt" 方法中接受 2 个参数(但是实际的 Guard 接口实际上根本不需要存在尝试方法,这只是默认的 Laravel 脚手架)。

示例 SessionGuard 有以下尝试方法:

public function attempt(array $credentials = [], $remember = false)
{
    $this->fireAttemptEvent($credentials, $remember);
    $this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);

    if ($this->hasValidCredentials($user, $credentials)) {
        $this->login($user, $remember);
        return true;
    }

    $this->fireFailedEvent($user, $credentials);
    return false;
} 

依次调用 login(同样不是 Guard 接口的一部分,只是 laravel 脚手架)。如果您继续遵循调用顺序,它可以归结为:

protected function cycleRememberToken(AuthenticatableContract $user)
{
    $user->setRememberToken($token = Str::random(60));
    $this->provider->updateRememberToken($user, $token);
}

其次是:

protected function queueRecallerCookie(AuthenticatableContract $user)
{
    $this->getCookieJar()->queue($this->createRecaller(
        $user->getAuthIdentifier().'|'.$user->getRememberToken()
    ));
}

大概是将记住的令牌存储在(可能是加密的)cookie 中,并在以后使用它自动登录用户。

只是要指出 Laravel 是开源的,只要您需要有关实现的详细信息,就可以自己完成查看源代码的整个过程。