laravelbrasil / forum

Ama Laravel? Torne se um Jedi e Ajude outros Padawans
GNU General Public License v3.0
252 stars 13 forks source link

Problema Laravel 5.5 Rotas para API #136

Open ronicec opened 7 years ago

ronicec commented 7 years ago

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!!!

juniorb2ss commented 7 years ago

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.

ronicec commented 7 years ago

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

omarkdev commented 7 years ago

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:

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