URL firmadas con Laravel

[vc_row el_class=”blog-info”][vc_column][vc_single_image source=”featured_image” img_size=”full” style=”vc_box_rounded”][vc_empty_space height=”40px”][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text el_class=”font-weight-bold”]

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

[/vc_column_text][vc_empty_space height=”40px”][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text]


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!

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row el_class=”social-info”][vc_column width=”1/6″][/vc_column][vc_column width=”2/3″][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text][social_share_button themes=’theme1′][/vc_column_text][/vc_column_inner][vc_column_inner el_class=”youtube-inner-col” width=”1/2″][vc_column_text][likebtn theme=”youtube” lang=”auto” show_like_label=”0″ white_label=”1″ alignment=”right”][/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner el_class=”social-info-inner”][vc_column_inner width=”1/4″][vc_single_image image=”921″][/vc_column_inner][vc_column_inner width=”3/4″][vc_column_text]

Diego Pacheco

Ingeniero en Sitemas, MBA (Babson College). Desarrollador PHP/Java/JavaScript. Fundador & CEO de EpicStudio. Entusiasta de las tecnologías web (JavaScript, Vue, Laravel, AWS, Docker) Viajes, Negocios, Surf y Growth.[/vc_column_text][asvc_list_item icon_fontawesome=”fa fa-calendar-o” icon_size=”14px”]Programar una reunión[/asvc_list_item][/vc_column_inner][/vc_row_inner][/vc_column][vc_column width=”1/6″][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

Recent Post

[/vc_column_text][lvca_posts_carousel posts_query=”size:3|order_by:rand|post_type:post” image_linkable=”true” image_size=”full” taxonomy_chosen=”post_tag” display_title=”true” display_post_date=”true” display_summary=”true” autoplay_speed=”3000″ animation_speed=”300″ display_columns=”3″ scroll_columns=”3″ gutter=”3″ tablet_display_columns=”2″ tablet_scroll_columns=”2″ tablet_gutter=”3″ tablet_width=”800″ mobile_display_columns=”1″ mobile_scroll_columns=”1″ mobile_gutter=”3″ mobile_width=”480″][vc_empty_space height=”20px”][/vc_column][/vc_row]