API no Laravel sem autenticação
Fala Carlos, beleza?
Estou criando uma API utilizando o Laravel mas gostaria que os endpoints só pudessem ser acessados pelo próprio dominio/servidor.
Exemplo: dominio.com/api/posts
O Frontend está sendo desenvolvido em NextJs e vai consumir essa api porém se alguém tentar acessar esse endpoint dominio.com/api/posts diretamente, eu quero bloquear a requisição e não mostrar os dados.
É possível fazer isso sem autenticação ? Ou seja, fazer com que apenas o NextJs consegue acessar os dados deste endpoint.
Entao o visitante acessa a URL dominio.com/posts -> O NextJs consome a api dominio.com/api/posts e mostra o resultado na tela.
Se o visitante acessar diretamente a URL dominio.com/api/posts a requisição é bloqueada.
Tentei procurar algo parecido no fórum mas nao encontrei, peço desculpas se já existir algum tópico com este assunto.
Obrigado.
Olá, Kleber!
Beleza, e com você?
Sim, é possível e até recomendado.
Você pode criar um middleware para validar essas requests, e verificar se o domínio de origem é realmente o seu:
request()->getHttpHost() === 'seudominio.com'
ou
request()->getHttpHost() === config('app.url_host')
// config/app.php
'url_host' => env('URL_HOST', 'seudominio.com')
Opa! Obrigado pela resposta.
Tentei aqui mas não deu certo, eu continuo conseguindo acessar a api diretamente pelo navegador/postman. Talvez eu tenha errado em algo, consegue me dar uma ajuda ?
Essa rota acessa a rota http://projeto.test/api/posts/ utilizando o axios, consome os dados e mostra na tela para o usuario:
http://projeto.test/posts/
Essa rota eu quero bloquear se o usuário tentar acessar diretamente e/ou utilizando postman, etc etc.
http://projeto.test/api/posts/
Como tentei aplicar o que mostrou:
Middleware:
Eu fiz o teste aqui, a lógica está correta, digo a lógica de recuperar a URL do host
Qual o valor do host?
dd(request()->getHttpHost());
Então, eu continuo conseguindo acessar a api diretamente digitando o endereço no navegador/postman
Qual o valor do host?
o valor é projeto.test
Ah é verdade amigo, você precisa validar o host de requisição e não o host da API.
Existem alguns caminhos para isso, como controlar CORS (nas versões mais atuais do Laravel em config/cors.php em allowed_origins)
Outra alternativa comum (especialmente em webhooks) é tratar os headers da request (validar um token no cabeçalho e etc)
Se tiver rodando a aplicação Vue.js junto com o Laravel (usando o MIX) você pode passar um token dinâmico gerado pelo próprio backend nas requisições e quando receber a request no Laravel valida se o token é o mesmo.
Pegou as ideias amigo?
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!