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.
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!