我确定有人可以比我更好地回答这个问题。
简短的回答:
令牌使其更难有人猜测,同时使可用电子邮件中的重置链接重置密码所需要的凭据。
龙答:
在文件vendor/laravel/framework/src/Illuminate/Auth/Guard.php
,你会看到方法createRememberTokenIfDoesntExist
。这个方法实际上引用另一个方法,在refreshRememberToken
的上方设置你的令牌。
它使用laravel帮助函数str_random
。如果你将这个功能追溯到它的源头,你会发现它使用vendor/laravel/framework/src/Illuminate/Support/Str.php
类的random
方法。
public static function random($length = 16)
{
if (function_exists('openssl_random_pseudo_bytes'))
{
$bytes = openssl_random_pseudo_bytes($length * 2);
if ($bytes === false)
{
throw new \RuntimeException('Unable to generate random string.');
}
return substr(str_replace(array('/', '+', '='), '', base64_encode($bytes)), 0, $length);
}
return static::quickRandom($length);
}
现在我们终于回到构建令牌的地方。此方法使用功能openssl_random_pseudo_bytes
来生成令牌。您可以在PHP手册页中阅读关于openssl_random_pseudo_bytes的函数,但基本上它会生成一个密码强的随机字符串。然后Laravel接受这个字符串(仍然是随机方法),base 64编码它,替换一些字符,并根据默认设置16(参见定义$length = 16
)或调用者传递给方法的长度。
因此,您会得到一个字符串,它的加密性很强,然后作为您的令牌进行操作。
如果您查看文件vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php
并找到方法retrieveByToken
,您会看到laravel同时使用用户记录ID和令牌来查找需要更改密码的用户。
对于有人猜测字符串和具有该标记的用户记录的id会非常困难,并需要知道您的应用程序的业务逻辑。
据我所知,它没有任何阻止。我认为这只是“某人”不知道令牌,并且在一段时间后过期会使其“足够安全”。 – lukasgeiter 2014-11-23 16:49:08