Laravel 更改密码重置特定令牌的令牌持续时间

Posted

技术标签:

【中文标题】Laravel 更改密码重置特定令牌的令牌持续时间【英文标题】:Laravel Change Password Reset Token duration for specific tokens 【发布时间】:2019-09-16 01:56:05 【问题描述】:

在我的应用程序中,用户的帐户将由其他人为他们创建,所以我想向他们发送密码重置电子邮件,以便他们设置密码并登录。问题是我不想要这些链接像默认密码重置电子邮件一样在 60 分钟后过期。现在我可以更改过期时间,但我希望常规密码重置保持在 60 分钟,但欢迎电子邮件链接要么永不过期,要么在很长一段时间后过期。

如果不实施第二个令牌系统,我怎么能做到这一点,我似乎找不到任何相关信息。

我想我也可以只允许用户在令牌过期时重新发送欢迎电子邮件,但这有点烦人。

【问题讨论】:

【参考方案1】:

过期持续时间在auth.php 中定义。您可以简单地定义另一个具有不同过期时间的配置:

'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    'users_welcome' => [
        'provider' => 'users',
        'table' => 'password_resets',
        'expire' => 120,
    ],
],

当您生成邮件时,您可以使用新的代理:

\Illuminate\Support\Facades\Password::broker('users_welcome')->sendResetLink($user->email);

为了检查令牌是否过期,Laravel 使用重置的created_at 和定义的过期时长:

    /**
     * Determine if the token has expired.
     *
     * @param  string  $createdAt
     * @return bool
     */
    protected function tokenExpired($createdAt)
    
        return Carbon::parse($createdAt)->addSeconds($this->expires)->isPast();
    

https://github.com/laravel/framework/blob/5.8/src/Illuminate/Auth/Passwords/DatabaseTokenRepository.php#L139

【讨论】:

所以我以为我有这个工作,但我发现在使用重置密码表单时它仍在使用默认密码代理。有没有办法我可以使用相同的表单和相同的控制器操作,但为那些使用users_welcome 代理生成令牌的用户使用不同的代理? 我以为您不想更改默认密码重置。如果你能以某种方式区分普通用户和其他人创建的用户(也许你需要一个额外的用户属性),你可以覆盖 ForgotPasswordController 上的 broker() 方法并返回 users_welcome 代理。 我不想更改默认密码。我的问题刚刚出现,因为我不想更改密码重置的功能,无论用户忘记密码还是需要通过欢迎电子邮件设置密码,它们都完全相同。我可以创建第二个控制器并查看和覆盖代理,但问题是由于两个代理都使用用户模型,因此即使它们是由相反的代理生成的,令牌对两个代理都有效(我对此进行了测试)。这可能意味着用户可以将他们的令牌复制到另一个 url 并且它仍然有效。有任何想法吗?谢谢! 恐怕我不明白这个问题。没错,Laravel 只检查用户的令牌是否存在,而不是由哪个代理生成。但检查是否过期使用配置中的expire 设置。因此,您使用自定义代理生成的有效期更长。 对不起,我可能解释得不够充分。所以我有使用默认密码代理的 ResetPasswordController。它有路线password/reset/token。现在我不能对欢迎令牌使用相同的路由,因为它使用默认密码代理。我可以创建说 WelcomeController,它也将使用 Illuminate\Foundation\Auth\ResetsPasswords 特征,并具有路由 /password/set/token,并覆盖 broker() 方法。问题是拥有令牌的用户(或黑客)可以将令牌粘贴到 password/set/token 路由中,因此它将使用新的代理。

以上是关于Laravel 更改密码重置特定令牌的令牌持续时间的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5 密码重置令牌表单未出现

Laravel 5.5 自定义重置密码抛出令牌不匹配

Laravel 5.1/AngularJS:在 Angular 视图中重置密码(如何验证 CSRF 令牌?)

实现思路

无法在 MVC 5 项目中生成密码重置令牌?

NestJS & Passport:更改用户密码时更改 JWT 令牌?