使用 Laravel Auth 和加密的用户表发送重置链接

Posted

技术标签:

【中文标题】使用 Laravel Auth 和加密的用户表发送重置链接【英文标题】:Send reset link with Laravel Auth and encrypted user table 【发布时间】:2018-10-27 17:21:24 【问题描述】:

我有一个 laravel 5.4 安装,我总是使用默认的 Laravel 身份验证保护来处理用户身份验证,主要是密码恢复过程。

现在我必须使用Elocryptfive 库对users 表中的电子邮件进行加密,因此我还添加了email_hash 字段,其中邮件的哈希值存储在数据库中,以便通过用户轻松检索用户电子邮件。

我可以使用哈希轻松验证用户身份:

Auth::attempt([
    'email_hash' => hash('sha256', $request->get('email')), 
    'password' => $request->get('password')]
, $remember);

我无法使用的是密码重置过程。是否有一个类可以重写,以便通过 email_hash 检索用户,然后访问解密的电子邮件并发送邮件,而无需重写整个忘记密码的过程?

【问题讨论】:

在您的ResetPasswordController.php 中,您可以覆盖Illuminate\Foundation\Auth\ResetsPasswords 使用的函数,您可以自己调出文件或查看the laravel api。让我知道这是否有帮助。 是的,我必须做类似的事情,我回答了这个问题,作为其他有同样问题的人的参考。谢谢 太棒了,很高兴我能帮上忙! 【参考方案1】:

我找到了实现这一目标的方法。如果其他人需要有关该主题的帮助,我将回答我自己的问题以提供有用的解决方案:

在您的 ForgotPasswordController.php 中,覆盖 sendResetLinkEmail 函数:

/**
 * Send a reset link to the given user.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\RedirectResponse
 */
public function sendResetLinkEmail(Request $request)

    $this->validateEmail($request);

    $hashed = hash('sha256', $request->get('email'));
    $user = User::where('email_hash', $hashed)->first();

    if (!is_null($user)) 
        $response = Password::sendResetLink(
            ['email_hash' => $hashed]
        );
     else 
        $response = Password::INVALID_USER;
    

    return $response == Password::RESET_LINK_SENT
        ? $this->sendResetLinkResponse($response)
        : $this->sendResetLinkFailedResponse($request, $response);

在您的 ResetPasswordController.php 中,覆盖 credentials 函数:

/**
 * Get the password reset credentials from the request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
protected function credentials(Request $request)

    return [
        'email_hash' => hash('sha256', $request->get('email')),
        'password' => $request->get('password'),
        'password_confirmation' => $request->get('password_confirmation'),
        'token' => $request->get('token')
    ];

感谢Mike Rodham指出正确的方向,希望对大家有所帮助。

【讨论】:

以上是关于使用 Laravel Auth 和加密的用户表发送重置链接的主要内容,如果未能解决你的问题,请参考以下文章

laravel auth认证

Laravel 在不破坏身份验证的情况下加密用户电子邮件

使用带有 JWT Auth/Laravel 的 Angular JS 获取新的刷新令牌后,如何恢复/重新发送请求?

Laravel AUTH() - 添加其他用户(无需注册)

Laravel Auth::login 不被尊重

如何使用 Laravel 在响应正文中发送 auth cookie?