Laravel 5.7.9 подтверждение по электронной почте - Принудительно войти в систему - PullRequest
0 голосов
/ 23 октября 2018

После завершения установки для включения новой встроенной проверки электронной почты все работает хорошо (отправка электронной почты после регистрации и нажатие на активацию активируют учетную запись).
Но я столкнулся со случаем, когда пользовательнеобходимо войти в систему, чтобы процесс проверки включился.Это означает, что если пользователь не вошел в систему до использования ссылки для подтверждения, он будет перенаправлен на страницу входа, а затем ему будет представлена ​​страница /resources/view/auth/verify.blade.php.

Я обращаюсь к сообществу, чтобы узнать,это намеренно, баг или я что-то не так делаю?Кто-то работал в такой же ситуации?

У создаваемого мною сайта есть публичный доступ к большинству страниц, но ограничен некоторыми (на данный момент пользовательским порталом).Я настроил routes/web.php следующим образом:

// Authentication
Auth::routes(['verify' => true]);
Route::group(['middleware' => ['auth', 'verified'], 'as' => 'portal.', 'prefix' => '/portal'], function () {
    Route::get('/', 'PortalController@index');
    Route::get('/profile', 'PortalController@index')->name('profile');
    Route::get('/orders', 'PortalController@index')->name('orders');
});

Отслеживая процесс проверки, я смог обнаружить, что процесс принудительно выполняет вход в конструктор VerificationController через промежуточное ПО, показанное ниже..

public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('signed')->only('verify');
        $this->middleware('throttle:6,1')->only('verify', 'resend');
    }

При комментировании первой строки или добавлении ->except('verify') страница входа не отображается, но в методе Traits VerifiesEmails выдается ошибка. Проверьте, как показано ниже, поскольку пользователь явноне зарегистрировано ($request->user() равно нулю).

public function verify(Request $request)
    {
        if ($request->route('id') == $request->user()->getKey() &&
            $request->user()->markEmailAsVerified()) {
            event(new Verified($request->user()));
        }

        return redirect($this->redirectPath())->with('verified', true);
    }

Мой вопрос, есть ли способ заставить его работать без предварительного входа в систему, или это способ реализации процесса проверкив 5,7?... или что я делаю не так?

1 Ответ

0 голосов
/ 23 октября 2018

есть ли способ заставить его работать без предварительного входа в систему, или это способ верификации реализован в 5.7?... или что я делаю не так?

Таким образом, процесс проверки реализован в Laravel 5.7.Laravel использует подписанные URL для проверки.URL генерируется с параметром id (идентификатор как идентификатор пользователя), и когда пользователь нажимает на ссылку для проверки, выполняется 3 проверки:

  1. Является ли подпись действительной?(signed middleware)
  2. Какой идентификатор пользователя в подписи?Это идентификатор, который в конечном итоге будет проверен
  3. Имеет ли текущий зарегистрированный пользователь тот же идентификатор?

Вы всегда можете удалить третью проверку, переопределив метод verify в вашем VerificationController, например:итак:

public function verify(Request $request)
{

    $userId = $request->route('id');
    $user = App\User::findOrFail($userId);

    if ($user->markEmailAsVerified()) {
        event(new Verified($user));
    }

    return redirect($this->redirectPath())->with('verified', true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...