Подписанные маршруты

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

Одним из самых простых способо решения этой задачи является использование так называемых подписанных URL-адресов в Laravel

Для создания подписанного URL к маршруту у него должно быть имя.

Чтобы создать подписанный URL необходимо использовать метод signedRoute для фасада URL

use Illuminate\Support\Facades\URL;

return URL::signedRoute('unsubscribe', ['user' => 1]);

Для создания подписанных ссылок с временным ограничением используется метод temporarySignedRoute

use Illuminate\Support\Facades\URL;

return URL::temporarySignedRoute(
    'unsubscribe', now()->addMinutes(30), ['user' => 1]
);

Для валидации подписи входящего запроса следует использовать метод hasValidSignature входящего Request

use Illuminate\Http\Request;

Route::get('/unsubscribe/{user}', function (Request $request) {
    if (! $request->hasValidSignature()) {
        abort(401);
    }

    // ...
})->name('unsubscribe');

Как альтернативу возможно использование посредника. Для этого необходимо определить посредника в массиве routeMiddleware

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routeMiddleware = [
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
];

После этого посредника можно добавлять к маршруту

Route::post('/unsubscribe/{user}', function (Request $request) {
    // ...
})->name('unsubscribe')->middleware('signed');