“A página expirou devido à inatividade” - Laravel 5.5


111

Minha página de registro está exibindo o formulário corretamente com CsrfToken ( {{ csrf_field() }}) presente no formulário).

HTML do formulário

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

Estou usando autenticação embutida para os usuários. Não mudou nada, exceto as rotas e redirecionamentos.

Quando eu envio o formulário (logo após recarregar também), dá que A página expirou devido à inatividade. Atualize e tente novamente. erro.

Meu Deus, estou faltando uma coisa muito pequena. Mas não tenho certeza do que é. Qualquer ajuda?

Atualizar

Encontrou o problema. O driver da sessão foi definido como array. Alterou para arquivo e o erro desapareceu agora. Mas o que há de errado se eu usar array?


Pode ter algo a ver com o armazenamento_path não ser gravável. É aqui que ele armazena os dados da sessão sobre tokens, se você estiver usando sessões baseadas em arquivo.
Devon,

1
Encontrou o problema. O driver da sessão foi definido como array. Alterou para arquivo e o erro desapareceu agora. Mas o que há de errado se eu usar array?
Sougata Bose de


1
Para uma nova versão do laravel, use @csrf para resolver o problema.
Vuong Tran

Respostas:


164

Se você chegou a esta resposta diretamente de uma pesquisa , certifique-se de que já adicionou o token csrf ao seu formulário com {{ csrf_field() }}o OP semelhante.


Se você tiver o driver de sessão definido como arquivo:

Pode ter algo a ver com o storage_path não ser gravável. É aqui que ele armazena os dados da sessão relativos aos tokens, se você estiver usando sessões baseadas em arquivo. O pode ser verificado comis_writable(config('session.files'))


Para o OP, o driver da sessão foi definido como array. Array é apenas para teste. Como os dados não são persistentes, não será possível comparar o token na próxima solicitação.

O driver de array é usado durante o teste e evita que os dados armazenados na sessão sejam mantidos.

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


Verifique config / session.php

Por último, um problema que acabei de ter, tínhamos um projeto que tinha o domínio da sessão e configurações seguras em config / session.php, mas o site de desenvolvimento não estava usando HTTPS (SSL / TLS). Isso causou esse erro genérico, uma vez que sessions.secure foi definido como true por padrão.


3
Está bem. Mas, por enquanto, está em desenvolvimento. Então, se eu uso array, por que estava me dando esse erro?
Sougata Bose

O teste @SougataBose não é desenvolvimento. Os dados da matriz não são persistentes ...
Devon

Essa é a razão pela qual se deve passar pelos DOCs corretamente .. :)
Sougata Bose

Meu problema não foi resolvido. Eu fiz o básico de verdade. Mas estou usando provedores e serviços personalizados. Não há nenhum problema quando eu chamo um método de controlador, mas quando eu executo um método de serviço em um controlador que chamou com pós-solicitação, o problema aparece!
Behnam Azimi

1
Tive um problema semelhante com as sessões, mas em relação aos testes. Descobri que quando eu estava usando Carbon::setTestNow($time);nos testes, eu não estava limpando usando Carbon::setTestNow();depois.
riotCode 01 de

77

Encontrei o mesmo problema no Laravel 5.5. No meu caso, aconteceu depois de mudar uma rota de GET para POST. O problema era porque eu esqueci de passar um token CSRF quando mudei para o POST.

Você pode postar um token CSRF em seu formulário chamando:

 {{ csrf_field() }}

Ou exclua sua rota em app / Http / Middleware / VerifyCsrfToken.php

 protected $except = [
        'your/route'
    ];

2
csrf_field()presente no formulário. A resposta aceita descreve o problema. Obrigado.
Sougata Bose

1
No meu caso, estava recebendo um POST de um terceiro, então adicionar csrf_field () não era uma opção. Como a CSRF não foi um fator no meu caso, adicionar uma exceção a essa rota resolveu o problema. Obrigado.
Fábio Duque Silva

Meu problema não foi resolvido. Eu fiz o básico de verdade. Mas estou usando provedores e serviços personalizados. Não há nenhum problema quando eu chamo um método de controlador, mas quando eu executo um método de serviço em um controlador que chamou com pós-solicitação, o problema aparece!
Behnam Azimi

1
Não desative a verificação CSRF! É muito importante ter proteção. Aprenda como enviar adequadamente o token e proteger seus usuários conectados de javascript malicioso que pode enviar ações em seu nome.
Devon,



6

Meu caso foi resolvido com SESSION_DOMAIN, na minha máquina local teve que ser definido como xxx.localhost. Isso estava causando conflitos com a produção SESSION_DOMAIN, xxx.comque foi definida diretamente no arquivo de configuração session.php.


Qual driver de sessão você estava usando? fileou cookie?
KeitelDOG

4

Algumas informações são armazenadas no cookie que estão relacionadas a versões anteriores do laravel em desenvolvimento. Portanto, está em conflito com tokens gerados por csrf que são gerados por versões de terceiros. Limpe o cookie e experimente.


você conseguiu ver o <input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">tipo de código em html gerado?
Suresh Velusamy de

Ele está aí. Encontrou o problema. O driver da sessão foi definido como array. Alterou para arquivo e o erro desapareceu agora.
Sougata Bose

4

Pra quem ainda tem problema e nada ajudou. Preste atenção no parâmetro php.ini mbstring.func_overload. Ele deve ser definido como 0. E mbstring.internal_encoding definido como UTF-8. No meu caso, isso foi um problema.


Muito obrigado! Sua resposta salvou meu cérebro de bater)
Rustembek Kaliyev

3

Mudei a permissão para armazenamento e o erro desapareceu. Parecia que a falta de permissão era o problema.

sudo chmod -R 775 storage/

2
Tenha cuidado ao usar essas permissões abertas recursivamente. Eu recomendo fortemente contra 775 para arquivos. 755 para diretórios e 644 para arquivos é a norma.
Devon

3

adicione @csrfno formulário e também vá para VerifyCsrfToken.php

app-> Http-> Middleware-> VerifyCsrfToken.php

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

1

No meu caso, o site estava bem no servidor, mas não no local. Então me lembro que estava trabalhando em um site seguro.
Portanto, no arquivo config.session.php, defina a variável secure para false

'secure' => env('SESSION_SECURE_COOKIE', false),

0

Eu tinha o aplicativo com vários subdomínios e o cookie de sessão era o problema entre eles. Limpar os cookies resolveu meu problema.

Além disso, tente definir o SESSION_DOMAINem .env arquivo. Use o subdomínio exato que você está navegando.


0

Certifique-se de ter a hora correta do sistema em seu servidor web. No meu caso, a máquina vagabunda estava no futuro (26 de janeiro 14:08:26 UTC 2226), então é claro que o tempo no cookie de sessão do meu navegador expirou cerca de 200 anos atrás.



0

Eu descobri duas soluções para evitar esses erros 1) adicionando protected $ except = ['/ yourroute'] possível desabilitar a inspeção do token csrf da raiz definida. 2) apenas comentar a linha \ App \ Http \ Middleware \ VerifyCsrfToken :: class no grupo de middleware protegido no kernel


0

Tive o mesmo problema, mas o problema não está no framework e sim no navegador. Não sei por que, mas o google chrome bloqueia cookies automaticamente, no meu caso. Após a permissão dos cookies, o problema foi resolvido.


0

Resposta curta

Adicionar a entrada da rota para registeremapp/Http/Middleware/VerifyCsrfToken.php

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

e limpe o cache e a rota do cache com os comandos:

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

Detalhes

Cada vez que você acessa um site Laravel, um token é gerado, mesmo que a sessão não tenha sido iniciada. Então, a cada solicitação, esse token (armazenado nos cookies) será validado contra seu tempo de expiração, definido no SESSION_LIFETIMEcampo em config/session.phparquivo.

Se você mantiver o site aberto por mais do que o tempo de expiração e tentar fazer uma solicitação, esse token será avaliado e o erro de expiração retornará. Portanto, para pular essa validação em formulários que estão fora das funções de usuários autenticados (como registro ou login), você pode adicionar a rota exceto em app/Http/Middleware/VerifyCsrfToken.php.


1
Se essa página processar entrada do usuário, ela deve passar por verificações de CSRF .
Sougata Bose

@SougataBose Na verdade, nesse caso acho que é melhor usar um validador de captcha como Google reCAPTCHA
JC Gras

0

Muitas vezes está acontecendo porque você está testando o projeto em data anterior


0

Solução:

use a nova guia anônima e teste-a novamente.

razão:

no meu caso, outro usuário fez login no meu painel de administração

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.