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

Недавно я обновил свой проект с Laravel 5.6 до 5.7 и добавил в свой проект шаги проверки электронной почты, описанные в документации Laravel. Все отлично работает на моей машине разработки (это http), но когда я обновляю свой производственный сервер (это https) со всеми изменениями, тогда, когда laravel отправляет мне электронное письмо со ссылкой (подписанный маршрут), он сгенерировал для меня, чтобы я нажал кнопку или вставил в мой браузер laravel, похоже, не может проверить созданную подпись. Побочный эффект заключается в том, что каждый раз, когда я нажимаю кнопку или вставляю ссылку в браузер, я получаю сообщение об ошибке:

403 Извините, у вас нет прав доступа к этой странице.

Что я проследил до сих пор, так это то, что я нашел код в классе ValidateSignature.php laravel и добавил несколько сообщений журнала.

public function handle($request, Closure $next)
{
    Log::info('checking signature');
    if ($request->hasValidSignature()) {
        Log::info('signature is valid');
        return $next($request);
    }

    Log::info('throwing InvalidSignatureException');
    throw new InvalidSignatureException;
}

И, более конкретно, я проследил точную проблему внутри модуля laravel UrlGenerator.php. Я добавил журналы следующим способом:

public function hasValidSignature(Request $request)
{
    $original = rtrim($request->url().'?'.Arr::query(
        Arr::except($request->query(), 'signature')
    ), '?');

    $expires = Arr::get($request->query(), 'expires');

    $signature = hash_hmac('sha256', $original, call_user_func($this->keyResolver));

    Log::info('url: '.$original);
    Log::info('expire: '.$expires);
    Log::info(' new signature: '.$signature);
    Log::info('link signature: '.$request->query('signature', ''));
    Log::info('hash equals: '.hash_equals($signature, $request->query('signature', '')));
    Log::info('expired: '.!($expires && Carbon::now()->getTimestamp() > $expires));

    return  hash_equals($signature, $request->query('signature', '')) &&
           ! ($expires && Carbon::now()->getTimestamp() > $expires);
}

Когда я нажимаю кнопку или вставляю ссылку в браузере и нажимаю Enter, я получаю следующие сообщения журнала: (Я изменил свой реальный домен по очевидным причинам .... не пытайтесь продавать мой сайт или что-то в этом роде)

checking signature
url: http://www.example.com/email/verify/2?expires=1538012234
expire: 1538012234
new signature: 1326b9e7402a51e0f05ddf1cb14f1e14852b4c5f0d1d6e726554806e7d85b4b1
link signature: e1d3ad5dc88faa8d8b0e6890ef60e216b75d26ef7ed5c6ab1cc661548e0ad8df
hash equals:
expired: 1
throwing InvalidSignatureException

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

**** ОБНОВИТЬ *****

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

url: http://www.example.com/email/verify/2?expires=1538012234

показывает нам проблему. Итак, как я уже сказал, моя машина разработки - это http, но мой живой сервер - https. Сегодня утром (после хорошего 4-часового сна) я вижу, что журнал показывает нам, что каким-то образом логика в методе hasValidSignature () получает маршрут с http вместо https. Поэтому, когда я возвращаюсь к своему электронному письму, ссылка в электронном письме - https, если я вставляю URL-адрес в свой браузер, он имеет https, и в моем браузере после того, как эта логика возвращает ошибку 403, браузер все еще показывает https. Итак, теперь мы можем сосредоточиться на том, как мой маршрут / URL-адрес преобразуется в http? Я действительно борюсь здесь, потому что я понятия не имею, как обрабатывается этот URL-адрес, поскольку / email / verify даже не указан ни в одном из моих файлов маршрутов (о которых я знаю), и я не могу сказать, что понимаю, что искать в капюшон для этого тоже, так что я действительно надеюсь на некоторую помощь здесь.

Также вот настройки в моем файле .env:

APP_USE_HTTPS=true
APP_URL=https://www.example.com
APP_ENV=production

И в методе загрузки AppServiceProvider у меня есть

public function boot()
{
    Schema::defaultStringLength(191);

    if (env('APP_USE_HTTPS'))
    {
        Log::info('forcing URLs to use https');
        \URL::forceScheme('https');
    }

person Wayne Fulcher    schedule 26.09.2018    source источник
comment
Проверьте журналы Laravel, переведите его в режим разработки, проверьте журналы PHP.   -  person miken32    schedule 27.09.2018
comment
Вы пробовали разные браузеры? Также - пробовали ли вы проверить, что нет правила брандмауэра / .htaccess, блокирующего доступ к папке, на которую указывает ссылка для подтверждения? Также - проверьте, что говорят журналы httpd / apache - особенно журналы доступа - если есть нарушение доступа, оно появится здесь   -  person alpharomeo    schedule 27.09.2018
comment
проверил все журналы, я не увидел ничего, связанного с этой проблемой. Я понятия не имею, что искать в .htaccess, потому что я еще не проверял причину, насколько я могу судить, нет папки, к которой можно получить доступ. маршрут в электронном письме - это просто / email / verify / ###, и в моем файле нет маршрута для электронной почты / verify, поэтому это один из тех Laravelisms, и я не уверен, куда идет этот маршрут, но в основном это только выполнение кода где-то затем перехожу на свою панель инструментов, к которой я могу перейти напрямую, так что это не то. как я уже сказал, все остальные страницы сайта работают нормально, поэтому я не уверен, где локать   -  person Wayne Fulcher    schedule 27.09.2018
comment
и я пробовал Chrome, Firefox, т.е. и Edge, у всех них одна и та же проблема.   -  person Wayne Fulcher    schedule 27.09.2018
comment
Использует ли ваш маршрут промежуточное ПО?   -  person Felippe Duarte    schedule 27.09.2018
comment
Я использую встроенное промежуточное ПО для аутентификации   -  person Wayne Fulcher    schedule 27.09.2018
comment
I am not sure where that route goes - не бойтесь читать исходный код. Это один из лучших способов учиться. Погрузитесь в кодовую базу Laravel и проследите по этому маршруту на протяжении всего жизненного цикла запроса / ответа. Лучший способ понять эти вещи - следовать им, шаг за шагом.   -  person fubar    schedule 27.09.2018
comment
Я согласен и боюсь, что нет. Я нашел часть кода и включил обновление в свой пост с другим тестом, который я сделал, но как я ни старался, я не смог найти в Laravel никакого другого кода, который помог бы мне найти проблему здесь. Я стараюсь заглядывать под капот как можно чаще, но в данном случае мое невежество показывает, что я не могу полностью связать точки.   -  person Wayne Fulcher    schedule 27.09.2018
comment
Я сделал что-то не так, задав здесь свой вопрос? Может быть, есть какое-то правило, о котором я не знаю? Мне кажется странным, что кто-то голосует против этого вопроса? Сначала я исследовал все, что в моих силах. Это не повторяющийся вопрос .... Я надеюсь, что это не было связано с поддельным URL-адресом, который я разместил в своем сообщении. Очевидно, что local.test.com не существует, но, возможно, это так ... Просто не уверен. Я чувствовал, что мне нужен пример URL-адреса, поскольку он так тесно связан с проблемой. ???   -  person Wayne Fulcher    schedule 27.09.2018
comment
Что-то очевидное для проверки - генерируются ли электронные письма, содержащие подписанные маршруты, в том же приложении Laravel, что и приложение, которое проверяет подпись?   -  person fubar    schedule 27.09.2018
comment
В частности, они не обязательно должны быть одним и тем же приложением, но у них должен быть один и тот же APP_KEY в файле .env. Так, например, если вы поставили уведомление в очередь, вам нужно убедиться, что кодовая база, которую использует работник очереди, имеет тот же APP_KEY, что и кодовая база, которую использует пользователь.   -  person patricus    schedule 27.09.2018
comment
@patricus, это именно то место, куда я направлялся со своим расследованием.   -  person fubar    schedule 27.09.2018
comment
да, приложение, которое генерирует электронную почту / ссылку, является тем же приложением, на которое указывает ссылка. Я собираюсь посмотреть, насколько глубоко я могу углубиться в код как для создания ссылки, так и для метода hash_hmac (), чтобы увидеть, в чем разница.   -  person Wayne Fulcher    schedule 27.09.2018
comment
Привет, ребята, я опубликовал обновление выше, которое теперь указывает на какую-то проблему с маршрутизацией. Любая помощь будет принята с благодарностью, так как это стало для меня очень своевременным.   -  person Wayne Fulcher    schedule 27.09.2018
comment
Вы устранили проблему ??. Если исправите, просьба написать в ответ. Я тоже получаю сообщение об ошибке :(   -  person mightyteja    schedule 24.03.2019


Ответы (1)


person    schedule
comment
Сейчас 2020 год, и у меня все еще проблема с Laravel 7.x. Почему этого недостаточно, просто сопоставив APP_URL в .envfile? Вот мой вопрос, пожалуйста, помогите. - person Pathros; 11.08.2020