Получить URL для сброса пароля

Я пытаюсь изменить аутентификацию 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 и токен точно совпадают с тем, что находится в базе данных, с допустимым периодом, равным неделе (для тестирования), и каждый токен, созданный таким образом, говорит, что он недействителен.

Как тогда вы выполняете авторизацию для системы только для приглашений, или как вы просто вручную создаете токен сброса и затем отправляете его в настраиваемом электронном письме? В документах упоминается возможность заменить электронную почту для сброса пароля, но я не хочу этого, я хочу дополнить ее.

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;
}

.....
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)
0

По вопросам рекламы [email protected]