Laravel 5.7 проверка электронной почты бросает 403

Я реализовал проверку электронной почты в проекте Laravel 5.7, над которым я работаю. Я получаю электронное письмо, но всякий раз, когда я нажимаю кнопку подтверждения или даже URL-адрес, указанный в электронном письме, я получаю сообщение о запрещенной ошибке 403.

Я искал несколько решений, но не смог найти ни одного решения этой проблемы. Единственным разумным указателем на эту ошибку является проблема с github https://github.com/laravel/framework/issues/25716, которая была объединена и закрыта Тейлором Отвеллом, но проблема все еще сохраняется.

Вот письмо, которое я получаю: Laravel 5.7 проверка электронной почты бросает 403 Вот ошибка, которую он выдает, когда я нажимаю кнопку или actionUrl в нижнем колонтитуле электронной почты: Laravel 5.7 проверка электронной почты бросает 403, а вот URL-адрес, отображаемый при отображении страницы 403 https://www.mywebsite.com/email/verify/1?expires=1540140119&signature=fd7dc72b05da6f387b2f52a27bceee533b2256436f211930c1319c7a544067da

Помогите, пожалуйста. Спасибо

Изменения: эта проблема возникает только в рабочем приложении. Локально эта проверка электронной почты работает, но выдает 403 на рабочий (рабочий) сервер. Моя почтовая служба - это mailgun, и я могу получить доступ ко всем остальным электронным сообщениям, относящимся к приложению, за исключением завершения проверки электронной почты. Мне нужна помощь, пожалуйста. Спасибо в ожидании

Когда вы используете php artisan route:list, получаете ли вы следующее промежуточное ПО для имени маршрута verification.verify: web,auth,signed,throttle:6,1?

emotality 21.10.2018 18:07

Да, я понимаю. Я просто проверил еще раз, чтобы подтвердить

Ehi 21.10.2018 18:27

Привет, @Ehi, ты установил свой APP_URL в свой файл .env?

rpm192 07.11.2018 12:52

На будущее у меня проблема заключалась в том, что я уже вошел в систему с другой учетной записью в Chrome, когда я пытался проверить электронную почту новой учетной записи. Выход из первой учетной записи (или использование другого браузера для второй учетной записи) устранил проблему.

Scotch Design 10.09.2021 03:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
4
4
8 479
8

Ответы 8

Чтобы использовать проверку электронной почты Laravel, вы должны сначала добавить правильные маршруты.

Если вы посмотрите на Illuminate/Routing/Router.php, вы увидите, что по умолчанию проверка маршрута отключена.

if ($options['verify'] ?? false) 
{
    $this->emailVerification();
}

Чтобы включить маршруты проверки, добавьте в web.php следующее:

Auth::routes(['verify'=>true]);

Тогда беги

php artisan route:list

чтобы убедиться, что он работает.

Auth::routes(['verify'=>true]); уже добавлен в мой файл web.php, поэтому я не думаю, что это проблема.
Ehi 21.10.2018 23:04

Я проверяю свои проекты и вижу ту же ошибку. в auth / verifyController.php проверьте подпись "подписанного промежуточного программного обеспечения". если вы добавите что-то в свой URL-адрес, это не удастся. в моем случае, когда отключите и включите, эта проблема промежуточного программного обеспечения решена !!

user10117885 22.10.2018 10:49

Обычно это происходит, если ваше приложение работает за некоторыми прокси и, вероятно, не обрабатывает завершение SSL.

Решение состоит в том, чтобы добавить

protected $proxies = '*';

к промежуточному программному обеспечению TrustProxies.

Ссылка: https://laracasts.com/discuss/channels/laravel/hitting-403-page-when-clicking-verify-link-in-email-using-new-laravel-verification-57?page=1

Одна из причин, которые были в моем случае, может заключаться в том, что вы уже вошли в систему с обычным проверенным пользователем, и вы щелкнули ссылку подтверждения в электронном письме. В этом случае он выстрелит 403. На мой взгляд, это ненормально, но неважно.

Для вашего удаленного вопрос. Рассмотрим a = 1, b = 11

kelalaka 05.01.2020 22:38

Оказывается, это часто происходит, когда ваше приложение laravel работает через прокси (apache, nginx и т. д.), Поэтому мы в конечном итоге заменяем подпрограммированное промежуточное ПО laravel по умолчанию на наше собственное промежуточное ПО, которое проверяет ссылки https: //. Этот ответ StackOverFlow помог мне решить эту проблему:

Подписанный маршрут для проверки электронной почты не проходит проверку подписи

Проверьте метод verify внутри трейта VerifyEmails, там у них есть:

if (! hash_equals((string) $request->route('hash'), sha1($request->user()->getEmailForVerification()))) {
    throw new AuthorizationException;
}

Я сбросил эту переменную $request->route('hash'), и она была нулевой, поэтому я переопределил ее в VerificationController:

    /**
 * Mark the authenticated user's email address as verified.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 * @throws \Illuminate\Auth\Access\AuthorizationException
 */
public function verify(Request $request)
{
    if (! hash_equals((string) $request->route('id'), (string) $request->user()->getKey())) {
        throw new AuthorizationException;
    }

    if (! hash_equals((string) $request->query('hash'), sha1($request->user()->getEmailForVerification()))) {
        throw new AuthorizationException;
    }

    if ($request->user()->hasVerifiedEmail()) {
        return redirect($this->redirectPath());
    }

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

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

И теперь это работает!

это сработало для меня, есть идеи, что вызывает ошибку?

user2722667 21.11.2019 18:13

Для меня потому что вручную создать маршрут проверки. который в laravel 6.x или 7.x. Путь маршрута для проверки электронной почты изменился. с /email/verify/{id} на /email/verify/{id}/{hash} Это, вероятно, происходит только потому, что я использую правила вручную, а не Auth::routes(['verify' => true]) для получения дополнительной информации руководство по обновлению laravel upgrade # email-verify-route-change

Проблема для меня заключалась в том, что у моего APP_URL был протокол http, и когда я щелкнул ссылку проверки, NGINX автоматически перенаправил URL-адрес с http на https, поэтому проверка подписи не прошла. Я обновил APP_URL, чтобы у меня был протокол https, и это решило мою проблему.

Мой личный опыт решения этой проблемы заключался в том, что я установил MAIL_DRIVER на log в файле .env, и Laravel экранировал специальные символы (такие как &), когда сохранял ссылку активации в журнале.

Поэтому НИКОГДА не используйте log для MAIL_DRIVER, если у вас есть письмо с подтверждением. (моя версия Laravel была 5.8).

Другие вопросы по теме