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

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Подписанный маршрут для проверки электронной почты не проходит проверку подписи

Сообщение Anonymous »

Я недавно обновил свой проект от Laravel 5.6 до 5.7 и добавил шаги проверки электронной почты, описанные Laravel Docs, в мой проект.
Все отлично работает на моем машине разработки (который является HTTP), но когда я обновляю свой производственный сервер (который является HTTPS) со всем подпись, которую он создал. Побочный эффект - каждый раз, когда я щелкну кнопкой или вставляю ссылку в браузер, я получаю ошибку: < /p>

403 Извините, вам не разрешено получать доступ к этой странице.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;
}
< /code>

и, в частности, я проследил точную проблему внутри UrlGenerator.php Uniter.php
Я добавил журналы в следующем методе: < /p>

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);
}
< /code>

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

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

Так что я не знаю, находится ли ошибка в логике, где Laravel создает начальную подпись или когда она пытается ее проверить.
Однако, как я уже говорил, отлично работает на моей машине разработки. Я очистил кэш, очищенные маршруты, обновленные до последнего кода, перезагруженный сервер, все, о чем я могу придумать.
Любая помощь будет высоко оценена.
Я не могу поверить, что я не видел этого прошлой ночью. Если мы внимательно посмотрим на выходные журналы, перечисленные выше сообщения о одном сообщении журнала < /p>

url: http://www.example.com/email/verify/2?e ... 1538012234
< /code>

показывает нам проблему. Так, как я уже говорил, моя машина разработки была http, но мой живой сервер - HTTPS. Я вижу сегодня утром (после хорошего 4 -часового сна), что журнал показывает нам, что логика в методе hasValidsignature () получает маршрут с HTTP вместо HTTPS. Поэтому, когда я возвращаюсь к своей электронной почте, ссылка в электронном письме - HTTPS, если я вставлю URL -адрес в свой браузер, у нее есть HTTPS, и в моем браузере после этой логики возвращает ошибку 403, которую браузер все еще показывает HTTPS. Я действительно борюсь здесь, потому что я понятия не имею, как этот URL -адрес обрабатывается с тех пор /электронная почта /проверка, даже не указан ни в одном из моих файлов маршрутов (о которых я знаю), и я не могу сказать, что я понимаю, что искать под капюшоном для этого, так что я действительно надеюсь на некоторую помощь здесь. < /P>

Также в моем файле.APP_USE_HTTPS=true
APP_URL=https://www.example.com
APP_ENV=production
< /code>

и в методе загрузки AppServiceProvider I есть < /p>

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

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


Подробнее здесь: https://stackoverflow.com/questions/525 ... validation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»