Laravel 5.7 подписанный маршрут возвращает 403 неверных подписи - PullRequest
0 голосов
/ 22 декабря 2018

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

Я использую последнюю версию Laravel с PHP7.2

Это мой маршрут web.php:

Route::get('/report/{user}/{client}', function ($user, $client) {
    return ("El usuario es: $user y el cliente es: $client");
})->name('report.client')->middleware('signed');

, и это в моем контроллере:

$objDemo->tempURL = Url::temporarySignedRoute('report.client', now('America/Panama')->addDays(5), [
            'user' => 1,
            'client' => 1
        ]);

URL генерируется и показывает что-то вроде этого:

https://example.com/report/1/1?expires=1545440368&signature=55ad67fa049a74fe8e123c664e50f53564b76154e2dd805c5927125f63c390a1

Но когда я нажимаю на ссылку, получается 403 с сообщением: «Неверная подпись»

Есть идеи?заранее спасибо

----------- ОБНОВЛЕНИЕ ------------

То, что я уже сделал:

  1. Попробуйте маршрут без подписи, и отлично работает
  2. Попробуйте маршрут без параметров и только подпись
  3. Попробуйте маршрут без временной настройки и только подпись
  4. УстановитьIP-адрес cloudflare для доверенных прокси
  5. Отключить HTTPS, Включить HTTPS

Кажется, что ничего не работает, всегда получая страницу недействительной подписи 403

----------- ОБНОВЛЕНИЕ 2 ------------

Хорошо, поэтому после некоторого копания и тестирования я обнаружил, что подписанные laravel маршруты не будут работать, если пользовательвошел в систему, это странно, если я выхожу из системы, то маршрут работает отлично, но если я захожу в систему, то это показывает ошибку 403, может ли это быть потому, что Laravel добавляет заголовок cookie сеанса после всего остального?и поэтому подписанный маршрут не получается из-за этого?это так и должно быть?

Странно, потому что, скажем, я хочу создать временную ссылку для моих пользователей, чтобы что-то скачать, если они войдут в мое приложение Laravel, они будутполучить это сообщение об ошибке 403 ...: (*

------------ ОБНОВЛЕНИЕ 3 ------------------

Я попробовал новую установку laravel и работал отлично, так что это что-то из моего основного приложения Laravel, также пытался установить каждую зависимость компоновщика в установку Fresh Laravel, и все равно работал отлично, независимо от пользователястатус входа в систему, поэтому это не противоречит моим зависимостям.

Ответы [ 4 ]

0 голосов
/ 06 августа 2019

По сути, ваши подписи не совпадают, потому что URL, который вы сгенерировали с помощью \ Illuminate \ Support \ Facades \ URL :: signatureRoute, был изменен вашим промежуточным программным обеспечением, то есть когда он проверял $ request-> hasValidSignature (), это возвращало false.

У меня была похожая проблема, когда SendGrid добавлял строки запроса отслеживания UTM к URL-адресам в моем электронном письме (& utm_campaign = website & utm_source = sendgrid.com & utm_medium = email), который изменял URL-адрес и в конечном итоге изменял подпись.

Когда я взломал, я добавил следующий код в свой контроллер, чтобы удалить дополнительные параметры запроса и повторно использовать сигнатуру:

// Fix issue with sendgrid highjacking signed URL's with extra query params..
if ($request->query('utm_campaign')) {
    $sig = $request->query('signature', '');
    $url = route('route-key') . '?signature=' . $sig;

    return redirect($url);
}
0 голосов
/ 30 мая 2019

Если вы используете Heroku, AWS или любой другой сервис, который использует LoadBalancer.Убедитесь также, что доверяющий вашему приложению прокси-сервер является доверенным.

Подробнее см. в этом ответе .

0 голосов
/ 08 июля 2019

Попробуйте код ниже:

class TrustProxies extends Middleware
{
    protected $proxies = '*';
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
}
0 голосов
/ 04 января 2019

После отладки UrlGenerator :: hasValidSignature () я закончил DD переменными внутри UrlGenerator.php следующим образом:

public function hasValidSignature(Request $request, $absolute = true)
    {
        $url = $absolute ? $request->url() : '/'.$request->path();

        //dd($url);

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

        dd($original);
        $expires = Arr::get($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);
    }

переменная $original показала мне, что на самом деле происходит с моим URL, ипоказал это:

https://example.com/report/1/1?expires=1546586977&settings%5Bincrementing%5D=1&settings%5Bexists%5D=1&settings%5BwasRecentlyCreated%5D=0&settings%5Btimestamps%5D=1&profile%5Bincrementing%5D=1&profile%5Bexists%5D=1&profile%5BwasRecentlyCreated%5D=0&profile%5Btimestamps%5D=1&user%5Bincrementing%5D=1&user%5Bexists%5D=1&user%5BwasRecentlyCreated%5D=0&user%5Btimestamps%5D=1

, как вы можете видеть, есть параметры после параметра expires, те параметры, которые были добавлены после создания маршрута, и это было проблемой, это произошло из-за того, что у меня было промежуточное программное обеспечение, предоставляющее некоторую информациютакие взгляды:

UserDataMiddleware.php

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;
use App\User;
use App\Setting;
use App\UserProfile;
use Illuminate\Support\Facades\View;

class UserData
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        if (Auth::check()) {
            $settings = Setting::where('user_id', Auth::user()->id)->first();
            $profile = UserProfile::where('user_id', Auth::id())->first();
            $user = Auth::user();

            View::share('settings', $settings); //Another way to share variables, with the View::share
            View::share('profile', $profile);

            //Now we need to share owr variables trough the REQUEST to our controllers
            $request->merge([
                'settings' => $settings,
                'profile' => $profile,
                'user' => $user
            ]);


        }
        return $next($request);
    }
}

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

...