URL firmadas con Laravel

url firmadas

URL firmadas con Laravel

Las URL firmadas por Laravel son excelentes para proteger algunas de sus rutas al requerir que se pase un token secreto a la URL como parámetro.

Esto es particularmente útil para los enlaces de “cancelación de suscripción” enviados por correo electrónico a sus usuarios, o cualquier otra acción. De esta manera, sus clientes no necesitan autenticarse en su aplicación para realizar la acción.

url firmadas


Se vuelve imposible cancelar la suscripción del usuario # 23 sin el token. También hace que sea imposible dar de baja a un usuario que no sea el # 23, ya que el hash está vinculado al resto de parámetros de la ruta.

Para crear URL firmadas, necesita una ruta con nombre y utilizar el método signedRoute de la fachada de la URL.

use Illuminate\Support\Facades\URL;
return URL::signedRoute('unsubscribe', ['user' => 23]);

El método devuelve una cadena como esta:
https://foo.test/users/23/unsubcribe?signature=f834ed8570e05de6c50ad10bd6abcf71e9867fcb14bdf2670b4bf572ce346f3b


Establecer un límite de tiempo

También puede establecer una fecha de vencimiento cuando genera el token. Esto es útil, por ejemplo, si desea generar un enlace de descarga que solo debería ser válido por unos minutos.

use Illuminate\Support\Facades\URL;
return URL::temporarySignedRoute(
    'files.download', now()->addMinutes(30), ['file' => 6]
);

Verificar una solicitud entrante

Ahora que sabe cómo generar una URL firmada, veamos cómo validar las solicitudes entrantes.

Opción 1: con el middleware

Simplemente use el middleware firmado (signed).

Route::post('users/{user}/unsubscribe', UnsubscribeUser::class)
->name('unsubscribe')
->middleware('signed');

Para hacer esto, asegúrese de que el middleware firmado (signed) esté presente en la propiedad $routeMiddleware de su clase App\Http\Kernel.

use Illuminate\Routing\Middleware\ValidateSignature;
protected $routeMiddleware = [
    // ...
    'signed' => ValidateSignature::class,
];

Opción 2: con el método de solicitud

Alternativamente, puede llamar al método hasValidSignature en la Solicitud entrante:

use Illuminate\Http\Request;public function unsubscribe(Request $request)
{
    if (! $request->hasValidSignature()) {
        abort(403);
    }    // ...
}

¡Es tan simple como eso!

Recent Post