我正在尝试修改默认的Laravel 5.6 Auth,以便通过电子邮件将其创建密码的链接发送给新用户,因为这是仅邀请系统,并且我不想通过电子邮件将其密码以明文形式发送给创建的用户。
在5.3中,我能做的就是从password_resets表中获取重置令牌,并通过“创建密码”按钮向他们发送通知。
在5.6中(不确定何时更改),它似乎是数据库中其密码重置令牌的加密版本。然后,如何在自定义通知中调用正确的网址,以使用户能够创建密码?
这是我在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和令牌与数据库中的内容完全匹配,有效期设置为一周(以进行测试),并且以此方式创建的每个令牌都表示无效。
然后如何为仅邀请系统进行身份验证,或者如何手动创建重置令牌并通过自定义电子邮件发送它?该文档提到可以替换密码重置电子邮件,但我不想要,我想补充它。
答案 0 :(得分:0)
创建和保存令牌可以使用内置功能在一行中完成。花了一个小时大胆地使用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)
答案 1 :(得分:-1)
解决了!
这是我的5.6中的新控制器和通知,用于手动发送不同的密码创建电子邮件。我真正要做的就是在将令牌存储到数据库之前对其进行加密!然后,您将未加密的令牌传递给该URL的电子邮件,该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;
}
.....