php laravel

php - Enviar solicitud en Laravel 5.7, laravel 5.8-Error-419 Lo sentimos, su sesión ha caducado



(24)

Instalé Laravel 5.7

Se agregó un formulario al archivo /resources/views/welcome.blade.php

<form method="POST" action="/foo" > @csrf <input type="text" name="name"/><br/> <input type="submit" value="Add"/> </form>

Añadido al archivo /routes/web.php

Route::post(''/foo'', function () { echo 1; return; });

Después de enviar una solicitud POST:

419 Lo sentimos, tu sesión ha expirado. Por favor, actualice y pruebe de nuevo.

En la versión 5.6 no hubo tal problema.


caso 1: si está ejecutando un proyecto en su sistema local como 127.0.01: 8000,

entonces

agrega SESSION_DOMAIN= en tu archivo .env

o en su config / session.php ''domain'' => env(''SESSION_DOMAIN'', ''''),

y luego ejecute php artisan cache:clear

caso 2: si el proyecto se está ejecutando en un servidor y tiene un dominio como "mydomain.com"

agregue SESSION_DOMAIN=mydomain.com en su archivo .env

o en su config / session.php ''domain'' => env(''SESSION_DOMAIN'', ''mydomain.com''),

y luego ejecute php artisan cache:clear


¿Qué hay de usar

{{ csrf_field() }} lugar de @csrf

El error 419 se debe principalmente a problemas con el token csrf.


Acabo de tener exactamente el mismo problema y era culpa de mí ser completamente estúpido. ¡Deshabilité todos los campos del formulario (en lugar de solo el botón de envío) a través de javascript antes de enviar dicho formulario! Esto, por supuesto, dio como resultado que no se _token todos los elementos del formulario (incluido el campo _token oculto) que a su vez provocó el error 419

Espero que esto ayude a alguien de unas pocas horas de rascarse la cabeza!

Las entradas de formulario deshabilitadas no aparecen en la solicitud


Después de tanto tiempo lo tengo resuelto de esta manera.

Mi ruta de instalación de laravel no era la misma que la configurada en el archivo de configuración session.php

''domain'' => env(''SESSION_DOMAIN'', ''example.com''),


En mi caso, es muy ridículo. Recibo el error 419 cuando coloco Auth::routes() route Auth::routes() en la parte superior del archivo de ruta.

Auth::routes(); Route::middleware(''auth'')->group(function () { Route::get(''/'', ''DashboardController@index'')->name(''dashboard''); });

Y arreglé el error moviendo Auth::routes(); a la parte inferior del archivo de ruta.

Route::middleware(''auth'')->group(function () { Route::get(''/'', ''DashboardController@index'')->name(''dashboard''); }); Auth::routes();

Tal vez pueda ayudar a su caso también. Buena suerte.


En realidad SCRF es un token basado en sesión. Agregue su ruta en un grupo de rutas y agregue un middleware que controle las sesiones.

web es un middleware predeterminado en laravel y puede controlar las solicitudes de sesión.

Route::group(array(''middleware'' => [''web'']), function () { Route::post(''/foo'', function () { echo 1; return; }); });


En tu Http/Kernel.php

intenta comentar esta linea:

/Illuminate/Session/Middleware/AuthenticateSession::class,

en su matriz de middleware web

podría ser la raíz de tu problema



Has añadido el campo CSRF incorrectamente. En lugar de @csrf debería usar csrf_field() esta manera:

<form method="POST" action="/foo" > {{ csrf_field() }} <input type="text" name="name"/><br/> <input type="submit" value="Add"/> </form>


He tenido un problema similar y encontré una solución a eso.

si está haciendo eco o imprime algo desde el controlador mientras vuelve para ver este problema, aparecerá un mensaje emergente.

así que asegúrese de que no esté utilizando eco o impresión cuando su controlador regrese


Intente comentar fuera /App/Http/Middleware/EncryptCookies::class in /app/Http/Kernel.php Tengo un problema similar y lo resolví al hacerlo. Probablemente no sea la mejor solución porque la seguridad pero al menos funcionó.

Anteriormente lo intenté:

  • Limpiar cache
  • Generar nueva clave de aplicación
  • Ejecutar mi aplicación en varios navegadores (Chrome 70, Mozilla Firefox 57 e IE 11)
  • Ejecutar mi aplicación en otra computadora
  • Comentario /App/Http/Middleware/VerifyCsrfToken::class in /app/Http/Kernel.php
  • Comentario out /Illuminate/Session/Middleware/AuthenticateSession::class in /app/Http/Kernel.php
  • Actualizar y rebajar Laravel (entre 5.6 y 5.7)

Pero ninguno de estos anteriores funcionó para mí.

EDITAR

Mi caso aquí es cada vez que inicio sesión, se creará un nuevo archivo de sesión (el anterior aún se conserva, pero se olvida repentinamente. Revise el storage/framework/sessions ) y se genera un nuevo token CSRF. Entonces el problema no es con VerifyCsrfToken.

Como @Vladd mencionó en la sección de comentarios, nunca debe comentar out /App/Http/Middleware/VerifyCsrfToken::class . Debe comprobar que envió el token de CSRF correcto al servidor.


No hay problema en el código. He comprobado con el mismo código que escribiste con la nueva instalación.

Código de formulario:

<form method="POST" action="/foo" > @csrf <input type="text" name="name"/><br/> <input type="submit" value="Add"/> </form>

web.php archivo web.php :

Route::get(''/'', function () { return view(''welcome''); }); Route::post(''/foo'', function () { echo 1; return; });

El resultado después de enviar el formulario es:

Si borra el caché de su navegador o lo intenta con otro navegador, creo que se solucionará.


No puede hacer un retorno vacío en Laravel 5.6 o mayor. Laravel siempre espera que se devuelva un valor. (Lo sé por experiencia pasada). Esto se debe principalmente a cómo PHP 7 maneja los rendimientos vacíos.


Por defecto no tuve este problema. Entonces, lo que hice es chmod -R 644 sessions para replicar el problema.

Luego le di permisos a la carpeta de sesiones por chmod -R 755 sessions

Ahora mi código de proyecto funciona de nuevo.

La razón por la que sucede es que almacena su caché en un archivo con falta de permisos de escritura.

El archivo de configuración de la sesión se almacena en config / session.php. Asegúrese de revisar las opciones disponibles para usted en este archivo. De forma predeterminada, Laravel está configurado para usar el controlador de sesión de archivo, que funcionará bien para muchas aplicaciones. En aplicaciones de producción, puede considerar el uso de los controladores memcached o redis para un rendimiento de sesión aún más rápido.

Soluciones:

1 - Como he corregido anteriormente, puede otorgar 755 permisos a la carpeta de sesiones. 2 - Puede utilizar otra configuración de controlador de sesión.

archivo - las sesiones se almacenan en almacenamiento / marco / sesiones. cookie: las sesiones se almacenan en cookies seguras y encriptadas. Base de datos: las sesiones se almacenan en una base de datos relacional. memcached / redis: las sesiones se almacenan en una de estas tiendas rápidas basadas en caché. array: las sesiones se almacenan en un array PHP y no se conservarán.

Tener en cuenta; Si desea utilizar memcached / redis, debe tenerlos instalados en su servidor o su contenedor de redis docker debe estar ejecutándose.


Puede ser una exageración pero puedes intentar esto:

// Formulario que llama a la ruta denominada con un token oculto campo agregado

<form method="POST" action="{{ route(''foo'') }}" > @csrf <input type="hidden" name="_token" value="{!! csrf_token() !!}"> <input type="text" name="name"/><br/> <input type="submit" value="Add"/> </form>

// Ruta con nombre

Route::post(''/foo'', function () { return ''bar''; })->name(''foo'');

// Añade esto dentro del bloque <head></head> :

<meta name="_token" content="{!! csrf_token() !!}" />

Lo probé en mi local usando Homestead en Laravel 5.7, que era una instalación nueva con Laravel Installer 2.0.1 y funcionó. ¿Cuál es tu entorno?

Teoría: me pregunto si eso tiene algo que ver con la hoja que procesa las etiquetas html con {{ }} frente a {!! !!} {!! !!} en su entorno o en cómo lo está sirviendo (por ejemplo, php artisan serve ). Lo que me hace pensar que es la line 335 de /vendor/laravel/framework/src/illuminate/Foundation/helpers.php debería representar la misma línea que se escribió anteriormente.


Solo cambia .env SESSION_DRIVER = cookie


Solo para ponerlo ahí afuera, tuve los mismos problemas. En mi granja local funcionaría como se esperaba, pero después de enviarlo al servidor de desarrollo también recibí el mensaje de tiempo de espera de sesión. Pensando que es un problema de entorno, cambié de apache a nginx y eso hizo que el problema desapareciera milagrosamente.


También tuve un problema como este y descubrí que los archivos de la sesión estaban bloqueados para la escritura. Por lo tanto, no sé si está ejecutando su Laravel a través de vagrant o Docker, pero le aconsejo que intente cambiar los derechos del directorio de la sesión (y archivos, por supuesto) (cuando ejecute Laravel en una máquina virtual, debería cambie los derechos localmente y en la máquina virtual (por ejemplo, cuando comparte los archivos a través de NFS)

Me gusta esto:

chmod -R 777 storage/framework/sessions chmod -R 777 storage/logs

Lo sé, un permiso 777 es el peor desastre que puedas imaginar. Pero son útiles para solucionar problemas.

Para estar seguro de que nunca olvidé esto hice un guión de bash. (Lo llamé lalog, solo porque quería borrar los archivos de registro y establecer permisos)

Nota: asegúrese de que utiliza esto en el directorio de la sesión. En config / session.php hay una clave de files declarada con la ubicación. En mi caso:

<?php //........... ''files'' => storage_path(''framework/sessions''), //...........

Ubicación: / usr / bin / lalog (este es un archivo, no un directorio)
Ejecutar en shell como lalog

#!/bin/bash rm -rf /home/username/Projects/x/storage/logs/laravel.log echo "Laravel log removed" touch /home/username/Projects/x/storage/logs/laravel.log echo "Laravel log created" chmod -R 777 /home/username/Projects/x/storage/ echo "CHMOD 777 on Storage dir"

¡Advertencia! Esto permitirá el acceso de escritura para todos, ¡así que ten cuidado! Además, quizás haya alguna información útil en el archivo de registro de Laravel. (asegúrese de buscar en ese archivo de registro antes de ejecutar mi script de bash)

Además, sé que ya se ha mencionado. Pero, estar totalmente seguro de que siempre

  1. Permitir cookies en el navegador, por lo que el token se puede configurar en las cookies
  2. Compruebe si está utilizando @csrf en su archivo blade

La forma debe ser algo como esto.

<form method="POST" action="{{ route(''login'') }}"> @csrf ....... </form>


Tengo este problema hace mucho tiempo. Recordé que causa permiso de storage/framework/sessions . Es posible que desee cambiarlo mediante el comando chmod -R 0777 storage/framework/sessions . Funciono para mi


Un rápido mal enfoque es que vaya a app / http / middleware / verifycsrftoken.php y agregue la ruta en $ excepto la lista. La solicitud posterior será ignorada para la verificación del token CSRF.

protected $except = [ // ''doLogin.aspx'', ''create_coupon'', ];


Utilizo Laravel 5.7 Tuve el mismo problema y fue porque el token csrf no estaba en el formulario, así que agregando

@csrf

arreglado el problema


cambie su @csrf en welcome.blade.php a <input type="hidden" name="_token" value="{{ csrf_token() }}">

así su código de esta manera:

<form method="POST" action="/foo" > <input type="hidden" name="_token" value="{{ csrf_token() }}"> <input type="text" name="name"/><br/> <input type="submit" value="Add"/> <button type="submit">Submit</button> </form>


Antes de leer a continuación, asegúrese de tener @csrf o {{ csrf_field() }} en su formulario como

<form method="post"> @csrf <!-- {{ csrf_field() }} --> ... rest of form ... </form>

Aparece el mensaje de error de la sesión caducada porque en algún lugar falla la verificación del token csrf, lo que significa que la App/Http/Middleware/VerifyCsrfToken::class middleware ya está activada. En la forma ya se ha agregado la directiva de blade @csrf , que también debería estar bien.

Luego la otra área a revisar es la sesión. La verificación del token de csrf está directamente relacionada con su sesión, por lo que es posible que desee verificar si el controlador de su sesión funciona o no, por ejemplo, un Redis configurado incorrectamente puede causar un problema.

Tal vez pueda intentar cambiar su controlador / software de sesión de su archivo .env , los controladores compatibles se indican a continuación

Controladores de sesión compatibles en Laravel 5.7 (Doc Link)

  • file - las sesiones se almacenan en almacenamiento / marco / sesiones.
  • cookie : las sesiones se almacenan en cookies seguras y encriptadas.
  • database : las sesiones se almacenan en una base de datos relacional.
  • memcached / redis : las sesiones se almacenan en una de estas tiendas rápidas basadas en caché.
  • array : las sesiones se almacenan en un array PHP y no se conservarán.

Si su formulario funciona después de cambiar el controlador de sesión, entonces hay algún problema con ese controlador en particular, intente corregir el error desde allí.

Posibles escenarios propensos a errores

  • Es probable que las sesiones basadas en archivos no funcionen debido a los problemas de permisos con el directorio /storage (una búsqueda rápida en Google le traerá la solución)

  • En el caso del controlador de la base de datos, su conexión de base de datos podría ser incorrecta o la tabla de sessions podría no existir o configurarse de manera incorrecta (se confirmó que la parte de configuración incorrecta era un problema según el comentario de @Junaid Qadir).

  • redis/memcached configuración de redis/memcached es incorrecta o está siendo manipulada por algún otro código en el sistema al mismo tiempo.

Podría ser una buena idea ejecutar la php artisan key:generate y generar una nueva clave de aplicación que, a su vez, vaciará los datos de la sesión.

Borrar el caché del navegador DURO , encontré que Chrome y Firefox son los culpables más de lo que puedo recordar.

Lea más acerca de por qué las claves de aplicación son importantes


<form method="POST" action="{{ url(''foo'') }}" > or composer update or composer install or in your Http/Kernel.php comment this line (not recommended) // /App/Http/Middleware/VerifyCsrfToken::class,