【问题标题】:Get password reset URL获取密码重置网址
【发布时间】:2018-11-29 22:50:38
【问题描述】:

我正在尝试修改默认的 Laravel 5.6 身份验证,以便通过电子邮件向新用户发送创建密码的链接,因为这是一个仅限邀请的系统,我不想将创建的用户的密码作为纯文本通过电子邮件发送。

在 5.3 中,我能够做的是从 password_resets 表中获取重置令牌,并向他们发送带有“创建密码”按钮的通知。

在 5.6 中(不确定何时更改),它似乎是数据库中密码重置令牌的加密版本。然后我将如何在自定义通知中调用正确的 url 以便用户能够创建密码?

这是我在 5.3 中所拥有的:

控制器

......

$token = strtolower(str_random(64));

DB::table('password_resets')->insert([
    'email'      => $request->email,
    'token'      => $token,
    'created_at' => Carbon::now()
]);

$user->notify(new UserCreated($user));

......

密码创建电子邮件

.....

$token = DB::table('password_resets')->where('email', $user_email)->pluck('token')->first();

$url = url('/password/reset/' . $token);

......

将相同的代码复制到 5.6,它告诉我我的重置令牌无效。进行正常密码重置时,数据库中的令牌似乎不再与 url 中的令牌匹配。现在它们似乎被加密了?

我已确保电子邮件中的 url 和令牌与数据库中的内容完全匹配,有效期设置为一周(用于测试),并且以这种方式创建的每个令牌都表示无效。

那么您如何为仅限邀请的系统进行身份验证,或者您如何手动创建重置令牌,然后通过自定义电子邮件发送它?文档中提到可以替换密码重置电子邮件,但我不想要,我想补充它。

【问题讨论】:

  • 您能否展示您最初是如何执行此操作的代码?

标签: php laravel laravel-authentication


【解决方案1】:

解决了!

这是我在 5.6 中的新控制器和通知,用于手动发送不同的密码创建电子邮件。我真正需要做的就是在将令牌存储到数据库之前对其进行加密!然后您将未加密的令牌传递给该 url 的电子邮件,它会检查数据库中的加密令牌。

控制器

.....

$random_token    = strtolower(str_random(60));
$encrypted_token = bcrypt($random_token);

DB::table('password_resets')->insert([
    'email'      => $request->email,
    'token'      => $encrypted_token,
    'created_at' => Carbon::now()
]);

$user->notify(new AccountCreated($user, $random_token));

.....

电子邮件中,我只是在导入用户和令牌...

.....

public $user;
public $token;

public function __construct(User $user, $token)
{
    $this->user  = $user;
    $this->token = $token;
}

.....

【讨论】:

    【解决方案2】:

    可以使用内置功能在一行中创建和保存令牌。我花了一个小时大量使用dd() 来弄清楚,但我将它添加到我的User 模型中:

    <?php
    
    namespace App;
    
    use App\Notifications\AccountCreated;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Support\Facades\Hash;
    
    class User extends Authenticatable
    {
        use Notifiable;
    
        public function generatePassword()
        {
            $this->password = Hash::make(str_random(32));
        }
    
        public function sendWelcomeEmail()
        {
            // Generate a new reset password token and save it to the database
            $token = app("Password")::getRepository()->create($this);
    
            // Send notification
            $this->notify(new AccountCreated($this, $token));
        }
    }
    

    通知获取用户和令牌,与您的代码相同,因此它们可以包含在电子邮件文本中。然后在UserController::store() 我可以这样做:

        $user = new User($request->all());
        $user->generatePassword();
        $user->save();
        $user->sendWelcomeEmail();
    

    在电子邮件通知中,您可以使用它来获取实际 URL:

    $url = route("password.reset", $token)
    

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 1970-01-01
      • 2015-02-02
      • 2012-05-21
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 2012-07-15
      • 2015-06-04
      相关资源
      最近更新 更多