Я реализовал проверку электронной почты в проекте Laravel 5.7, над которым я работаю. Я получаю электронное письмо, но всякий раз, когда я нажимаю кнопку подтверждения или даже URL-адрес, указанный в электронном письме, я получаю сообщение о запрещенной ошибке 403.
Я искал несколько решений, но не смог найти ни одного решения этой проблемы. Единственным разумным указателем на эту ошибку является проблема с github https://github.com/laravel/framework/issues/25716, которая была объединена и закрыта Тейлором Отвеллом, но проблема все еще сохраняется.
Вот письмо, которое я получаю:
Вот ошибка, которую он выдает, когда я нажимаю кнопку или actionUrl в нижнем колонтитуле электронной почты:
, а вот URL-адрес, отображаемый при отображении страницы 403 https://www.mywebsite.com/email/verify/1?expires=1540140119&signature=fd7dc72b05da6f387b2f52a27bceee533b2256436f211930c1319c7a544067da
Помогите, пожалуйста. Спасибо
Изменения: эта проблема возникает только в рабочем приложении. Локально эта проверка электронной почты работает, но выдает 403 на рабочий (рабочий) сервер. Моя почтовая служба - это mailgun, и я могу получить доступ ко всем остальным электронным сообщениям, относящимся к приложению, за исключением завершения проверки электронной почты. Мне нужна помощь, пожалуйста. Спасибо в ожидании
Да, я понимаю. Я просто проверил еще раз, чтобы подтвердить
Привет, @Ehi, ты установил свой APP_URL в свой файл .env?
На будущее у меня проблема заключалась в том, что я уже вошел в систему с другой учетной записью в Chrome, когда я пытался проверить электронную почту новой учетной записи. Выход из первой учетной записи (или использование другого браузера для второй учетной записи) устранил проблему.






Чтобы использовать проверку электронной почты 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, поэтому я не думаю, что это проблема.
Я проверяю свои проекты и вижу ту же ошибку. в auth / verifyController.php проверьте подпись "подписанного промежуточного программного обеспечения". если вы добавите что-то в свой URL-адрес, это не удастся. в моем случае, когда отключите и включите, эта проблема промежуточного программного обеспечения решена !!
Обычно это происходит, если ваше приложение работает за некоторыми прокси и, вероятно, не обрабатывает завершение SSL.
Решение состоит в том, чтобы добавить
protected $proxies = '*';
к промежуточному программному обеспечению TrustProxies.
Одна из причин, которые были в моем случае, может заключаться в том, что вы уже вошли в систему с обычным проверенным пользователем, и вы щелкнули ссылку подтверждения в электронном письме. В этом случае он выстрелит 403. На мой взгляд, это ненормально, но неважно.
Для вашего удаленного вопрос. Рассмотрим a = 1, b = 11
Оказывается, это часто происходит, когда ваше приложение 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);
}
И теперь это работает!
это сработало для меня, есть идеи, что вызывает ошибку?
Для меня потому что вручную создать маршрут проверки. который в 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).
Когда вы используете
php artisan route:list, получаете ли вы следующее промежуточное ПО для имени маршрутаverification.verify:web,auth,signed,throttle:6,1?