Laravel 5.4:密码重置令牌自定义长度?

时间:2017-10-03 11:20:59

标签: php laravel laravel-5.4

我正在使用laravel 5.4构建一个API,如果用户已经验证,我会在密码重置时通过电子邮件向用户发送一个令牌,用户在重置密码之前会提供。目前发送的令牌有64个字符,而且用户抓得太大,我不确定laravel是否有配置为令牌提供自定义长度?

1 个答案:

答案 0 :(得分:4)

解决方案有点棘手,尽可能清楚地解释程序:

第1步 - 扩展标准DatabaseTokenRepository

创建一个扩展Illuminate\Auth\Passwords\DatabaseTokenRepository的类,以便定义新的令牌创建策略。

<?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使用您的令牌存储库而不是标准存储库。为此,您必须扩展课程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 PasswordServiceProvider
{

    // 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

中替换提供者

config/app.php密钥下的providers文件中注释掉以下行:

// Illuminate\Auth\Password\PasswordResetServiceProvider::class,

并在下面添加以下行:

App\Auth\Passwords\CustomPasswordResetServiceProvider::class,

<强>注意事项

在执行此类操作时要小心,将令牌定义为hash_hmac('sha256', Str::random(40), $this->hashKey) $this->hasKeyenv('APP_KEY)。这用于确保在生成密码重置令牌时不会发生冲突。我建议您研究一种安全的方法来安全地减少令牌长度。