Подписанные маршруты в Laravel. Как с ними работать?

Статья от программиста Binn Михаила Мельникова

Подписанные маршруты позволяют создавать такие маршруты, которые доступны только при передаче параметра GET. GET-параметр (CGI-параметр) — это динамический параметр в URL-адресе, с помощью которого можно изменить содержимое документа.

Laravel — это бесплатный веб-фреймворк с открытым кодом. Он помогает в создании URL-адресов для приложения. С его помощью можно создавать ссылки в ваших шаблонах и ответах API.

Подписанные маршруты можно использовать для публикации предварительного просмотра черновика статьи или любого другого пути, который вы хотите сделать общедоступным для пользователей, у которых есть подпись. Вы также можете настроить доступ к маршруту в течение определенного периода времени. 

Например, если вы запускаете новый курс или SaaS, вы можете открыть регистрацию только на один день и разрешить ограниченному количеству пользователей оформить подписку. 

В этом руководстве вы узнаете, как создавать подписанные маршруты для вашего приложения в Laravel.

Процесс создания подписанного маршрута

Для примера создадим маршрут, который возвращает код скидки. Этот маршрут будет доступен только в течение 10 минут, поэтому код на скидку получат первые несколько пользователей, которые попадут на этот маршрут. 

Чтобы создать подписанный маршрут, для начала вам необходимо запустить приложение Laravel. Далее откройте routes/web.php файл в любом текстовом редакторе и добавьте следующий код:

Route::get(‘/discount’, function(){

    return ‘some_discount_code_here’;

})->name(‘discountCode’)->middleware(‘signed’);

Краткое изложение маршрута:

  1. Определение маршрута получения, который доступен по /discount URL-адресу.
  2. Создание замыкания (closure), которое возвращает только строку. В реальном сценарии необходимо использовать контроллер, а также модель, которая будет возвращать код скидки из вашей базы данных.
  3. Указание, что этот маршрут именованный  name() методом.
  4. Указание, что этот маршрут подписанный посредником middleware(‘signed’)

Теперь, благодаря посреднику, маршрут будет доступен только в том случае, если у пользователя есть хэш подписи, который указан в качестве параметра. Если пользователь посетит /discount маршрут напрямую, без подписи, он получит ошибку 403 (Forbidden, доступ запрещен).

Далее мы расскажем, как получить временный подписанный URL-адрес маршрута.

Генерация подписи

1. Для генерации подписи используйте метод URL::temporarySignedRoute.

2. Создайте контроллер Laravel, который сгенерирует для вас подписанный маршрут:

php artisan make:controller DiscountController

3. Новый контроллер будет расположен по адресу:

app/Http/Controllers/DiscountController.php

4. Откройте файл с помощью вашего любого текстового редактора и добавьте URL фасад:

use Illuminate\Support\Facades\URL;

  1. После этого создайте общедоступный метод со следующим содержимым:

public function discount()

{

    return URL::temporarySignedRoute(

        ‘discountCode’, now()->addMinutes(30)

    );

}

Использование подписанного маршрута

Для добавления нового маршрута откройте routes/web.php файл и скопируйте следующий код:

use App\Http\Controllers\DiscountController;

Route::get(‘/generate-signature’, [DiscountController::class, ‘discount’]);

Теперь, если у вас будет доступ к /generate-signature URL-адресу через браузер и вы получите аналогичный результат:

http://example.com/discount?expires=1617628939&signature=20a44d614b6e4448c1f3a5bf78d3a44ca9b64b2afa940757bdb66ca2b1537974

Краткое изложение маршрута:

  1. Определение маршрута получения, который доступен по /discount URL-адресу.
  2. Использование  статического метода temporarySignedRoute и добавление параметров:
  • discountCode название маршрута;
  • now()->addMinutes(30) параметр, который указывает на то, что подпись будет действительна только в течение следующих 30 минут.

Теперь, когда пользователь зайдет на URL-адрес с подписью, он получит код скидки в качестве ответа.

Обратите внимание: если вы получите сообщение об ошибке, что signed класс не существует, обязательно добавьте в массив protected $routeMiddleware в файле:

app/Http/Kernel.php:

‘signed’ =>\Illuminate\Routing\Middleware\ValidateSignature::class,

URL-адрес будет действителен только в течение 30 минут, но вы можете сгенерировать подписанные URL-адреса так, чтобы они были действительны всегда.


Источник: devdojo.com 

Условия передачи информации

Я даю согласие OOO «ЭсБилдер» (далее «BINN») на обработку моих персональных данных в соответствии со статьями 6, 9, 10, 18 Федерального закона от 27 июля 2006 года № 152-ФЗ «О персональных данных», указанных в онлайн-форме и/или предоставленных мною с целью:

Способы обработки персональных данных могут быть любыми, включая сбор, систематизацию, накопление, хранение, уточнение, обновление, изменение, воспроизведение, обезличивание, блокирование и уничтожение.

Настоящее согласие применяется в отношении обработки следующих данных: имя, номер телефона, адрес электронной почты (E-mail).

Настоящее согласие предоставляется сроком на пять лет. По истечении указанного срока действие согласия считается продленным на каждые следующие пять лет при отсутствии сведений о его отзыве.

Согласие может быть отозвано мною в любой момент путем направления в BINN подписанного мною письменного заявления.