"La página ha expirado debido a la inactividad" - Laravel 5.5

111

Mi página de registro muestra el formulario correctamente con CsrfToken ( {{ csrf_field() }}) presente en el formulario).

Formulario HTML

<form class="form-horizontal registration-form" novalidate method="POST" action="{{ route('register') }}">
        {{ csrf_field() }}
        ....
</form>

Estoy usando autenticación incorporada para los usuarios. No han cambiado nada excepto las rutas y redireccionamientos.

Cuando envío el formulario (justo después de recargar también), indica que la página ha caducado debido a la inactividad. Por favor, actualice y pruebe de nuevo. error.

Dios mío, me falta una cosa muy pequeña. Pero no estoy seguro de qué es. ¿Alguna ayuda?

Actualizar

Encontré el problema. El controlador de sesión se configuró en array. Lo cambié a archivo y el error desapareció ahora. Pero, ¿qué pasa si uso una matriz?

Sougata Bose
fuente
Puede tener algo que ver con que storage_path no se pueda escribir. Aquí es donde almacena los datos de la sesión con respecto a los tokens si está utilizando sesiones basadas en archivos.
Devon
1
Encontré el problema. El controlador de sesión se configuró en array. Lo cambié a archivo y el error desapareció ahora. Pero, ¿qué pasa si uso una matriz?
Sougata Bose
o esta URL verifique stackoverflow.com/questions/39997180/…
Fatih TÜZEN
1
Para la nueva versión de laravel, use @csrf para resolver el problema.
Vuong Tran

Respuestas:

164

Si llega a esta respuesta directamente desde una búsqueda , asegúrese de haber agregado el token csrf a su formulario con {{ csrf_field() }}el OP.


Si tiene el controlador de sesión configurado para archivo:

Puede tener algo que ver con que storage_path no se pueda escribir. Aquí es donde almacena los datos de la sesión con respecto a los tokens si está utilizando sesiones basadas en archivos. Se puede verificar conis_writable(config('session.files'))


Para el OP, el controlador de sesión se configuró en array. Array es solo para pruebas. Dado que los datos no se conservan, no podrá comparar el token en la siguiente solicitud.

El controlador de matriz se utiliza durante las pruebas y evita que los datos almacenados en la sesión se conserven.

https://laravel.com/docs/5.5/session#configuration


Compruebe config / session.php

Por último, un problema que acabo de tener, teníamos un proyecto que tiene el dominio de sesión y la configuración segura en config / session.php pero el sitio de desarrollo no usaba HTTPS (SSL / TLS). Esto provocó este error genérico ya que session.secure se estableció en true de forma predeterminada.

Devon
fuente
3
Okay. Pero por ahora está en desarrollo. Entonces, si uso una matriz, ¿por qué me estaba dando ese error?
Sougata Bose,
Las pruebas de @SougataBose no son desarrollo. Los datos de la matriz no se conservan ...
Devon
Esa es la razón por la que uno debe pasar por los DOC correctamente .. :)
Sougata Bose
Mi problema no se resolvió. Hice lo básico de verdad. Pero estoy usando proveedores y servicios personalizados. No hay ningún problema cuando llamo a un método de controlador, pero cuando ejecuto un método de servicio en un controlador que llamó con una solicitud de publicación, ¡aparece el problema!
Behnam Azimi
1
Tuve un problema similar con las sesiones pero con respecto a las pruebas. Resultó que cuando estaba usando Carbon::setTestNow($time);en las pruebas no lo estaba borrando al usarlo Carbon::setTestNow();después.
riotCode
77

Me encontré con el mismo problema en Laravel 5.5. En mi caso, sucedió después de cambiar una ruta de GET a POST. El problema fue porque olvidé pasar un token CSRF cuando cambié a POST.

Puede publicar un token CSRF en su formulario llamando a:

 {{ csrf_field() }}

O excluya su ruta en la aplicación / Http / Middleware / VerifyCsrfToken.php

 protected $except = [
        'your/route'
    ];
Hyder B.
fuente
2
csrf_field()presente en la forma. La respuesta aceptada describe el problema. Gracias.
Sougata Bose
1
En mi caso, estaba recibiendo un POST de un tercero, por lo que agregar el csrf_field () no era una opción. Dado que CSRF no fue un factor en mi caso, agregar una excepción a esta ruta resolvió el problema. Gracias.
Fábio Duque Silva
Mi problema no se resolvió. Hice lo básico de verdad. Pero estoy usando proveedores y servicios personalizados. No hay ningún problema cuando llamo a un método de controlador, pero cuando ejecuto un método de servicio en un controlador que llamó con una solicitud de publicación, ¡aparece el problema!
Behnam Azimi
1
¡No desactive la verificación CSRF! Es muy importante tener protección. Aprenda a enviar correctamente el token y a proteger a los usuarios que han iniciado sesión de javascript malicioso que puede enviar acciones en su nombre.
Devon
11

Pruébalos todos.

composer dump-autoload
php artisan optimize
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
Sagar Chamling
fuente
En lugar de probar todos los comandos anteriores, use este paquete github.com/afrazahmmad/clear-all-cached-data
Afraz Ahmad
6

Mi caso se resolvió con SESSION_DOMAIN, en mi máquina local tenía que configurarse xxx.localhost. Estaba causando conflictos con la producción SESSION_DOMAIN, xxx.comque se estableció directamente en el archivo de configuración session.php.

Andrés Ruiz
fuente
¿Qué controlador de sesión estaba usando? fileo cookie?
KeitelDOG
4

Parte de la información se almacena en la cookie que está relacionada con versiones anteriores de laravel en desarrollo. Por lo tanto, está en conflicto con los tokens generados por csrf que son generados por versiones de otros. Simplemente borre la cookie y pruébelo.

Suresh Velusamy
fuente
¿Pudiste ver el <input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">tipo de código en html generado?
Suresh Velusamy
Está ahí. Encontré el problema. El controlador de sesión se configuró en array. Lo cambié a archivo y el error desapareció ahora.
Sougata Bose
4

Para aquellos que todavía tienen problemas y nada les ayudó. Preste atención al parámetro php.ini mbstring.func_overload. Tiene que establecerse en 0. Y mbstring.internal_encoding establecido en UTF-8. En mi caso eso fue un problema.

andrew_jackson
fuente
¡Muchas gracias! Tu respuesta salvó mi cerebro de
fallar
3

Cambié el permiso de almacenamiento y el error desapareció. Parecía que la falta de permiso era el problema.

sudo chmod -R 775 storage/
Buddhi Kasun
fuente
2
Tenga cuidado al utilizar estos permisos abiertos de forma recursiva. Recomiendo encarecidamente contra 775 para archivos. 755 para directorios y 644 para archivos es la norma.
Devon
3

agregue @csrfel formulario y también vaya a VerifyCsrfToken.php

aplicación-> Http-> Middleware-> VerifyCsrfToken.php

protected $except = [
        'paste your route here'
    ];
Shery
fuente
1

En mi caso, el sitio estaba bien en el servidor pero no en el local. Entonces recuerdo que estaba trabajando en un sitio web seguro.
Entonces, en el archivo config.session.php, configure la variable segura en falso

'secure' => env('SESSION_SECURE_COOKIE', false),
Irfandi D. Vendy
fuente
0

Tenía la aplicación con varios subdominios y la cookie de sesión era el problema entre ellos. Borrar las cookies resolvió mi problema.

Además, trate de establecer el SESSION_DOMAINen .env archivo. Utilice el subdominio exacto que está navegando.

Mladen Janjetovic
fuente
0

Asegúrese de tener la hora correcta del sistema en su servidor web. En mi caso, la máquina vagabunda estaba en el futuro (26 de enero a las 14:08:26 UTC 2226), así que, por supuesto, el tiempo en la cookie de sesión de mi navegador había expirado hace más de 200 años.

mim.ms
fuente
0

establecer mbstring.func_overload = 2

Me ayudó

Toxi Gen
fuente
0

He descubierto dos soluciones para evitar estos errores 1) agregando protected $ except = ['/ yourroute'] posible deshabilitar la inspección del token csrf desde la raíz definida. 2) simplemente comente \ App \ Http \ Middleware \ VerifyCsrfToken :: class line en el grupo de middleware protegido en el kernel

Damitha Dayananda
fuente
0

Tuve el mismo problema, pero el problema no está en el marco sino en el navegador. No sé por qué, pero Google Chrome bloquea las cookies automáticamente, en mi caso. Después de permitir las cookies, el problema se resolvió.

Anwar Pervez
fuente
0

Respuesta corta

Agregue la entrada de ruta para registerenapp/Http/Middleware/VerifyCsrfToken.php

protected $except = [
        '/routeTo/register'
    ];

y borre el caché y la ruta del caché con los comandos:

php artisan cache:clear && php artisan route:clear

Detalles

Cada vez que accede a un sitio de Laravel, se genera un token, incluso si la sesión no se ha iniciado. Luego, en cada solicitud, este token (almacenado en las cookies) se validará con su tiempo de vencimiento, establecido en el SESSION_LIFETIMEcampo en config/session.phparchivo.

Si mantiene el sitio abierto por más del tiempo de vencimiento e intenta realizar una solicitud, este token será evaluado y el error de vencimiento volverá. Por lo tanto, para omitir esta validación en formularios que están fuera de las funciones de los usuarios autenticados (como registro o inicio de sesión), puede agregar la ruta excepto en app/Http/Middleware/VerifyCsrfToken.php.

JC Gras
fuente
1
Si esa página procesa la entrada del usuario, debe pasar por comprobaciones CSRF .
Sougata Bose
@SougataBose De hecho, en ese caso creo que es mejor utilizar un validador de captcha como Google reCAPTCHA
JC Gras
0

Muchas veces sucede porque está probando el proyecto en una fecha anterior

oparam
fuente
0

Solución:

use la nueva pestaña de incógnito y luego pruébela nuevamente.

razón:

en mi caso, otro usuario inició sesión con mi panel de administración

sable tabatabaee yazdi
fuente