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
Esto es porque la forma requiere un csrf. En la versión 5.7, lo cambiaron a @csrf
<form action="" method="post">
@csrf
...
Referene: https://laravel.com/docs/5.7/csrf
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
- Permitir cookies en el navegador, por lo que el token se puede configurar en las cookies
-
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 deredis/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,