forum icon indicating copy to clipboard operation
forum copied to clipboard

Problema Laravel 5.5 Rotas para API

Open ronicec opened this issue 8 years ago • 3 comments

E ai meu povo, tudo bem?

Estou novamente aqui com um novo problema... estou usando o Laravel 5.5 e nesse processo estou com problemas nas rotas usando o middleware da API.

Para exemplificar, meu arquivo web.php está da seguinte maneira

<?php

Route::get('/', function () {
    return view('welcome');
});

Route::group(['middleware' => ['cors', 'api'], 'prefix' => 'api'], function()
{
    Route::get('/', function () {
        return response()->json(['message' => 'Jobs API', 'status' => 'Connected']);;
    });

    Route::post('auth/login', 'AuthController@login');
});

Eu estou testando via PostMan as rotas, se eu colocar a rota

http://192.168.15.253:8091/sys-pesquisa/public/api/

Tenho o seguinte retorno:

{
    "message": "Jobs API",
    "status": "Connected"
}

Se eu tentar acessar a Rota "POST" (auth/login) recebo a seguinte mensagem:

The page has expired due to inactivity. 

Please refresh and try again.

Percebi que se alterar de POST para GET deixando..

Route::get('auth/login' .........

Tenho o retorno positivo:

{"result":false,"errors":["The senha field is required.","The usuario field is required."]}

Porém como que é uma API que vai ser acessado via aplicativo móvel preciso q seja feito envio via POST.

Enfim, não faço ideia o que pode ser, pesquisei e encontrei algumas coisas falando sobre a classe 'VerifyCsrfToken', inclusive até adicionei esse trecho na classe VerifyCsrfToken:

protected $except = [
        'api/*'
    ];

Mas não tive sucesso... Alguém pode me ajudar?

Obrigado galera!!!

ronicec avatar Sep 16 '17 14:09 ronicec

Como esta as permissões de storage? Já verificou o driver de session? Procure mudar o diver de session, ou se tiver driver file, dê corretas permissões nas pastas.

juniorb2ss avatar Sep 19 '17 14:09 juniorb2ss

@juniorb2ss obrigado por responder... questão de configurações todas estão Default... não mexi em nada.

ronicec avatar Sep 19 '17 15:09 ronicec

Aparentemente seu problema está relacionado a verificação do token CSRF, mas o fato de ter adicionado nas exceções, era para parar de exibir o erro, mas vamos fazer da "forma correta".

No laravel na pasta routes existem os arquivos: web.php e api.php, onde as rotas dentro do arquivo web.php trabalham com o estado da sessão recebido e com proteção CSRF; Já as rotas dentro do arquivo api.php não funcionam da mesma maneira, elas são stateless, ou seja, a cada requisição é considerado como "nova" e não funcionam com o uso de sessões, em outras palavras, ela não tem um estado.

Na arquitetura RESTful, um dos padrões que devem ser aplicados, diz que uma api deve ser Stateless.

Caso você for seguir o padrão RESTful, suas rotas devem estar dentro do arquivo api.php, já que as rotas que vão estar nesse arquivo, estão com middlewares diferentes do que as que estão no em web.php, fazendo isso você já elimina o problema de CSRF, porém isso gera outra questão, como manter um usuário autenticado?

Hoje existem várias maneiras de se fazer isso, uma das mais adotadas e simples é a Token-based authentication, onde o usuário submete suas informações de login, caso seja válido sua autenticação, a aplicação retorna um token, que em suas próximas requisições este token deve ser passado nos cabeçalhos de requisição.

Como quase tudo no laravel é fácil de se fazer, você pode usar um pacote chamado JWT que faz isso pra você de forma quase automatica e ainda tem uma ótima documentação de como aplicar:

  • Pacote: https://github.com/tymondesigns/jwt-auth
  • Wiki (como instalar e configurar): https://github.com/tymondesigns/jwt-auth/wiki

Fazendo isso irá eliminar esse problema e com certeza irá evitar um monte de problemas futuros que você poderá ter.

omarkdev avatar Oct 02 '17 03:10 omarkdev