Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
При верификации электронной почты выскакивает ошибка 403 Invalid signature.
Все делал как описано в документации https://laravel.com/docs/6.x/verification , на почту приходит письмо со ссылкой https://www.mysite.fun/email/verify/100 … d511f788fd но при переходе по ссылке выскакивает указанная ошибка. Причем когда тестил локально то все работало, почта подтверждалась, а на хосте не работает.
Изменено Blag (27.02.2020 10:52:22)
Не в сети
после изучения этой проблемы выяснилось что когда урл возвращается в приложение то туда добавляются некоторые поля /email/verify/1000017/969d08de8def0191793ac93159abcd46b8104a23?_url=%2Femail%2Fverify%2F1000017%2F969d05de8def0191793ac93159abcd46b5104a23&expires=1582806418
подчеркнул те данные которых не должно было быть...что бы все начало работать пришлось переопределить посредника , который отвечает за проверку валидности сингатуры...
Не в сети
новый посредник выглядит так
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Routing\Exceptions\InvalidSignatureException;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Log;
class ValidateHttpsSignature
{
var $keyResolver;
public function __construct()
{
$this->keyResolver = function () {
return App::make('config')->get('app.key');
};
}
/**
* gebaseerd op vendor/laravel/framework/src/Illuminate/Routing/Middleware/ValidateSignature.php
* maar zorgt er voor dat een url altijd als https behandeld wordt. dit fixt het feit dat
* laravel achter een rewrite proxy draait en urls binnenkrijgt als http.
*
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
Log::info('class ValidateHttpsSignature в методе handle');
Log::info($request);
if ($this->hasValidSignature($request)) {
return $next($request);
}
throw new InvalidSignatureException;
}
/**
* Determine if the given request has a valid signature.
* copied and modified from
* vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php:363
* @param \Illuminate\Http\Request $request
* @param bool $absolute
* @return bool
*/
public function hasValidSignature(Request $request, $absolute = true)
{
$url = $absolute ? $request->url() : '/'.$request->path();
$url = str_replace("http://","https://", $url);
// $original = rtrim($url.'?'.Arr::query(
// Arr::except($request->query(), 'signature')
// ), '?');
$original = rtrim($url.'?expires='.$request->expires);
$expires = $request->query('expires');
$signature = hash_hmac('sha256', $original, call_user_func($this->keyResolver));
return hash_equals($signature, (string) $request->query('signature', '')) &&
! ($expires && Carbon::now()->getTimestamp() > $expires);
}
}
Не в сети
ну и дальше в контроллере VerificationController namespace App\Http\Controllers\Auth; в конструкторе меняем посредника
// $this->middleware('signed')->only('verify');
$this->middleware('customsigned')->only('verify');
и регистрируем его в Kernel namespace App\Http;
'customsigned' => \App\Http\Middleware\ValidateHttpsSignature::class,
решение временное пока не выясним что добавляет лишние поля в урл.
Не в сети