Usar URLs firmadas en Laravel

Laravel nos permite de forma muy sencilla crear URLs firmadas, que contienen un parámetro signature que permite a Laravel comprobar que la URL no ha sido modificada por un tercero desde que se generó.

Usar URLs firmadas en Laravel
Photo by Lewis Keegan / Unsplash

Laravel nos permite de forma muy sencilla crear URLs firmadas, que contienen un parámetro signature que permite a Laravel comprobar que la URL no ha sido modificada por un tercero desde que se generó.

Esto muy útil para URLs públicas que pueden ser fácilmente manipuladas. Por ejemplo, si tuviéramos una URL como /user/verify/12, podríamos simplemente cambiar el 12 por un 13 y estaríamos verificando un usuario diferente. Al generar una URL firmada, la URL sería algo así: /user/verify/12?signature=<hash>. A continuación, desde Laravel comprobaremos que la URL firmada sea válida y no se podrá acceder si se modifica.

Validar URL firmada en Laravel

Como siempre en Laravel, validar una URL firmada en Laravel es una tarea bastante sencilla y que se puede hacer de varias maneras:

use Illuminate\Http\Request;
 
Route::get('/verify/{user}', function (Request $request) {
    if (! $request->hasValidSignature()) {
        abort(401);
    }
 
    // ...
})->name('verify');

Además, si queremos permitir añadir ciertos parámetros a la URL (por ejemplo, desde el front de la app), podemos ejecutar hasValidSignatureWhileIgnoring para ignorar dichos parámetros durante la verificación.

if (! $request->hasValidSignatureWhileIgnoring(['page', 'order'])) {
    abort(401);
}

Siendo algo tan común, existe un Middleware que ya nos controla la validez de la firma:

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