Laravel 5.4:密码重置令牌自定义长度?
Laravel 5.4: Password reset token custom length?
我正在使用 laravel 5.4 构建一个 API,如果用户验证,我会通过电子邮件向用户发送密码重置令牌,用户在重置密码之前提供该令牌。目前发送的令牌有 64 个字符,太大用户无法获取,我不确定 laravel 是否有配置为令牌提供自定义长度?
解决方法有点棘手,我尽量把过程解释清楚:
第 1 步 - 扩展标准 DatabaseTokenRepository
创建一个扩展 Illuminate\Auth\Passwords\DatabaseTokenRepository
的 class 以定义新的令牌创建策略。
<?php
namespace App\Auth\Passwords;
use Illuminate\Auth\Passwords\DatabaseTokenRepository;
class CustomDatabaseTokenRepository extends DatabaseTokenRepository
{
// Overrides the standard token creation function
public function createNewToken()
{
retrun substr(parent::createNewToken(), 0, 30);
}
}
我刚刚将 Laravel 生成的令牌缩减为 30 个字符,请随意实现您自己的令牌生成例程。
第 2 步 - 扩展标准 PasswordBrokerManager
现在您必须告诉 PasswordBrokerManager
使用您的令牌存储库而不是标准存储库。为此,您必须扩展 class Illuminate\Auth\Passwords\PasswordBrokerManager
.
<?php
namespace App\Auth\Passwords;
use Illuminate\Auth\Passwords\PasswordBrokerManager;
class CustomPasswordBrokerManager extends PasswordBrokerManager
{
// Override the createTokenRepository function to return your
// custom token repository instead of the standard one
protected function createTokenRepository(array $config)
{
$key = $this->app['config']['app.key'];
if (Str::startsWith($key, 'base64:')) {
$key = base64_decode(substr($key, 7));
}
$connection = isset($config['connection']) ? $config['connection'] : null;
return new CustomDatabaseTokenRepository(
$this->app['db']->connection($connection),
$this->app['hash'],
$config['table'],
$key,
$config['expire']
);
}
}
第 3 步 - 扩展标准 PasswordResetServiceProvider
现在您必须扩展标准 Illuminate\Auth\Passwords\PasswordResetServiceProvider
以告诉 Laravel 实例化您的 CustomPasswordBrokerManager
。
<?php
namespace App\Auth\Passwords;
use Illuminate\Auth\Passwords\PasswordResetServiceProvider;
class CustomPasswordResetServiceProvider extends PasswordResetServiceProvider
{
// Override the method registerPasswordBroker
// in order to specify your customized manager
protected function registerPasswordBroker()
{
$this->app->singleton('auth.password', function ($app) {
return new CustomPasswordBrokerManager($app);
});
$this->app->bind('auth.password.broker', function ($app) {
return $app->make('auth.password')->broker();
});
}
}
第 4 步 - 最后一步,替换 config/app.php
中的提供商
在 providers
键下的 config/app.php
文件中注释掉以下行:
// Illuminate\Auth\Password\PasswordResetServiceProvider::class,
并在下面添加以下行:
App\Auth\Passwords\CustomPasswordResetServiceProvider::class,
注意事项
做这些事情时要小心,令牌定义为 hash_hmac('sha256', Str::random(40), $this->hashKey)
其中 $this->hasKey
是 env('APP_KEY
)。这用于确保在生成密码重置令牌时不会发生冲突。我建议您研究一种安全的方法来安全地减少您的令牌长度。
我正在使用 laravel 5.4 构建一个 API,如果用户验证,我会通过电子邮件向用户发送密码重置令牌,用户在重置密码之前提供该令牌。目前发送的令牌有 64 个字符,太大用户无法获取,我不确定 laravel 是否有配置为令牌提供自定义长度?
解决方法有点棘手,我尽量把过程解释清楚:
第 1 步 - 扩展标准 DatabaseTokenRepository
创建一个扩展 Illuminate\Auth\Passwords\DatabaseTokenRepository
的 class 以定义新的令牌创建策略。
<?php
namespace App\Auth\Passwords;
use Illuminate\Auth\Passwords\DatabaseTokenRepository;
class CustomDatabaseTokenRepository extends DatabaseTokenRepository
{
// Overrides the standard token creation function
public function createNewToken()
{
retrun substr(parent::createNewToken(), 0, 30);
}
}
我刚刚将 Laravel 生成的令牌缩减为 30 个字符,请随意实现您自己的令牌生成例程。
第 2 步 - 扩展标准 PasswordBrokerManager
现在您必须告诉 PasswordBrokerManager
使用您的令牌存储库而不是标准存储库。为此,您必须扩展 class Illuminate\Auth\Passwords\PasswordBrokerManager
.
<?php
namespace App\Auth\Passwords;
use Illuminate\Auth\Passwords\PasswordBrokerManager;
class CustomPasswordBrokerManager extends PasswordBrokerManager
{
// Override the createTokenRepository function to return your
// custom token repository instead of the standard one
protected function createTokenRepository(array $config)
{
$key = $this->app['config']['app.key'];
if (Str::startsWith($key, 'base64:')) {
$key = base64_decode(substr($key, 7));
}
$connection = isset($config['connection']) ? $config['connection'] : null;
return new CustomDatabaseTokenRepository(
$this->app['db']->connection($connection),
$this->app['hash'],
$config['table'],
$key,
$config['expire']
);
}
}
第 3 步 - 扩展标准 PasswordResetServiceProvider
现在您必须扩展标准 Illuminate\Auth\Passwords\PasswordResetServiceProvider
以告诉 Laravel 实例化您的 CustomPasswordBrokerManager
。
<?php
namespace App\Auth\Passwords;
use Illuminate\Auth\Passwords\PasswordResetServiceProvider;
class CustomPasswordResetServiceProvider extends PasswordResetServiceProvider
{
// Override the method registerPasswordBroker
// in order to specify your customized manager
protected function registerPasswordBroker()
{
$this->app->singleton('auth.password', function ($app) {
return new CustomPasswordBrokerManager($app);
});
$this->app->bind('auth.password.broker', function ($app) {
return $app->make('auth.password')->broker();
});
}
}
第 4 步 - 最后一步,替换 config/app.php
在 providers
键下的 config/app.php
文件中注释掉以下行:
// Illuminate\Auth\Password\PasswordResetServiceProvider::class,
并在下面添加以下行:
App\Auth\Passwords\CustomPasswordResetServiceProvider::class,
注意事项
做这些事情时要小心,令牌定义为 hash_hmac('sha256', Str::random(40), $this->hashKey)
其中 $this->hasKey
是 env('APP_KEY
)。这用于确保在生成密码重置令牌时不会发生冲突。我建议您研究一种安全的方法来安全地减少您的令牌长度。