Recientemente creé un nuevo proyecto de Laravel y seguí la guía sobre autenticación. Cuando visito mi ruta de inicio de sesión o registro, aparece el siguiente error:
ErrorException in Request.php line 775:
Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)
No he editado ningún archivo principal de Laravel, solo he creado las vistas y agregué las rutas a mi archivo routes.php
// Authentication routes
Route::get('auth/login', ['uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
Route::post('auth/login', ['uses' => 'Auth\AuthController@postLogin', 'as' => 'login']);
Route::get('auth/logout', ['uses' => 'Auth\AuthController@getLogout', 'as' => 'logout']);
// Registration routes
Route::get('auth/register', ['uses' => 'Auth\AuthController@getRegister', 'as' => 'register']);
Route::post('auth/register', ['uses' => 'Auth\AuthController@postRegister', 'as' => 'login']);
No tengo mucha experiencia con Laravel, así que disculpe mi ignorancia. Soy consciente de que hay otra pregunta que hace lo mismo, pero ninguna de las respuestas parece funcionar para mí. ¡Gracias por leer!
Editar:
Aquí está mi register.blade.php según lo solicitado.
@extends('partials.main')
@section('title', 'Test | Register')
@section('content')
<form method="POST" action="/auth/register">
{!! csrf_field() !!}
<div class="ui input">
<input type="text" name="name" value="{{ old('name') }}" placeholder="Username">
</div>
<div class="ui input">
<input type="email" name="email" value="{{ old('email') }}" placeholder="Email">
</div>
<div class="ui input">
<input type="password" name="password" placeholder="Password">
</div>
<div class="ui input">
<input type="password" name="password_confirmation"placeholder="Confirm Password">
</div>
<div>
<button class="ui primary button" type="submit">Register</button>
</div>
</form>
@endsection
Route::controllers([ 'auth' => 'Auth\AuthController', 'password' => 'Auth\PasswordController', ]);
Respuestas:
Deberá utilizar el middleware web si necesita el estado de la sesión, la protección CSRF y más.
fuente
php artisan key:generate
Si se añade el
routes
interior de laweb middleware
no funciona por algún motivo, trate de añadir esto a$middleware
enKernel.php
fuente
En mi caso (usando Laravel 5.3), agregar solo los siguientes 2 middleware me permitió acceder a los datos de sesión en mis rutas API:
\App\Http\Middleware\EncryptCookies::class
\Illuminate\Session\Middleware\StartSession::class
Declaración completa (
$middlewareGroups
en Kernel.php):fuente
Si la respuesta de Cas Bloem no se aplica (es decir, definitivamente tiene el
web
middleware en la ruta aplicable), es posible que desee verificar el orden de los middlewares en su kernel HTTP.El orden predeterminado
Kernel.php
es este:Tenga en cuenta que
VerifyCsrfToken
viene despuésStartSession
. Si los tiene en un orden diferente, la dependencia entre ellos también puede conducir a laSession store not set on request.
excepción.fuente
Un problema puede ser que intente acceder a su sesión dentro de la
__constructor()
función de su controlador .Desde Laravel 5.3+, esto ya no es posible porque no está destinado a funcionar de todos modos, como se indica en la guía de actualización .
Para obtener más información de antecedentes, lea también su respuesta de Taylor .
Solución alterna
Si aún desea usar esto, puede crear dinámicamente un middleware y ejecutarlo en el constructor, como se describe en la guía de actualización:
fuente
Laravel [5.4]
Mi solución fue usar el asistente de sesión global: session ()
Su funcionalidad es un poco más difícil que $ request-> session () .
escribiendo :
empujando :
recuperando :
fuente
En mi caso, agregué las siguientes 4 líneas a $ middlewareGroups (en app / Http / Kernel.php):
IMPORTANTE: ¡Las 4 nuevas líneas deben agregarse ANTES de 'aceleración' y 'fijaciones'!
De lo contrario, aparecerá un error "El token CSRF no coincide". He luchado con esto durante varias horas solo para encontrar que el orden es importante.
Esto me permitió acceder a la sesión en mi API. También agregué VerifyCsrfToken ya que cuando hay cookies / sesiones involucradas, CSRF debe ser atendido.
fuente
¿Puede usar
->stateless()
antes del->redirect()
. Entonces ya no necesitas la sesión.fuente
en mi caso fue solo para poner vuelta; al final de la función donde configuré la sesión
fuente
Si está usando CSRF ingrese
'before'=>'csrf'
En tu caso
Route::get('auth/login', ['before'=>'csrf','uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
Para obtener más detalles, consulte Laravel 5 Documentation Security Protecting Routes
fuente
No está en la documentación de laravel, he tardado una hora en lograr esto:
Mi sesión no persistió hasta que usé el método "guardar" ...
fuente
El grupo de middleware web Laravel 5.3+ se aplica automáticamente a su archivo routes / web.php por RouteServiceProvider.
A menos que modifique la matriz $ middlewareGroups del kernel en un orden no admitido, probablemente esté intentando inyectar solicitudes como una dependencia regular del constructor.
Usar solicitud como
en vez de
fuente
Recibí este error con Laravel Sanctum. Lo arreglé agregando
\Illuminate\Session\Middleware\StartSession::class,
alapi
grupo de middleware en Kernel.php, pero luego descubrí que esto "funcionaba" porque mis rutas de autenticación se agregaron enapi.php
lugar deweb.php
, por lo que Laravel estaba usando la protección de autenticación incorrecta.Moví estas rutas aquí
web.php
y luego comenzaron a funcionar correctamente con elAuthenticatesUsers.php
rasgo:Descubrí el problema después de recibir otro error extraño sobre
RequestGuard::logout()
no existe.Me hizo darme cuenta de que mis rutas de autenticación personalizadas están llamando a métodos del rasgo AuthenticatesUsers, pero no estaba usando
Auth::routes()
para lograrlo. Luego me di cuenta de que Laravel usa la protección web de forma predeterminada y eso significa que las rutas deben estar enroutes/web.php
.Así es como se ven mis configuraciones ahora con Sanctum y una aplicación Vue SPA desacoplada:
Kernel.php
config / auth.php
A continuación, puede tener pruebas unitarias como ésta, donde críticamente,
Auth::check()
,Auth::user()
, yAuth::logout()
funciona como se espera con configuración mínima y máxima de usoAuthenticatesUsers
yRegistersUsers
características.Aquí hay un par de mis pruebas unitarias de inicio de sesión:
TestCase.php
LoginTest.php
Anulé los métodos
registered
yauthenticated
en los rasgos de autenticación de Laravel para que devuelvan el objeto de usuario en lugar de solo 204 OPCIONES:Mire el código del proveedor para ver los rasgos de autenticación. Puede utilizarlos intactos, además de los dos métodos anteriores.
Aquí están las acciones de Vuex de mi Vue SPA para iniciar sesión:
Me tomó más de una semana conseguir que las pruebas unitarias de autenticación de Vue SPA + de Laravel Sanctum + del mismo dominio funcionaran a la altura de mi estándar, así que espero que mi respuesta aquí pueda ayudar a ahorrar tiempo a otros en el futuro.
fuente