Я пытаюсь изменить аутентификацию 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 и токен точно совпадают с тем, что находится в базе данных, с допустимым периодом, равным неделе (для тестирования), и каждый токен, созданный таким образом, говорит, что он недействителен.
Как тогда вы выполняете авторизацию для системы только для приглашений, или как вы просто вручную создаете токен сброса и затем отправляете его в настраиваемом электронном письме? В документах упоминается возможность заменить электронную почту для сброса пароля, но я не хочу этого, я хочу дополнить ее.
Решил это!
Вот мой новый контроллер и уведомление в 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;
}
.....
Создание и сохранение токена можно выполнить в одну строку, используя встроенные функции. Заняло у меня час и поразительное использование 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)