[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Kleber Brito Vasconcelos Filho
Criador Kleber Brito Vasconcelos Filho 23/04/2021

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.

Manager Carlos Ferreira 23/04/2021

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')

Carlos Ferreira
Criador Kleber Brito Vasconcelos Filho 23/04/2021

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:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class ApiAccess
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $domains = ['projeto.test'];

        if(!in_array(request()->getHttpHost(), $domains))
            abort(403, 'Unauthorized action.');

        return $next($request);
    }
}
Kleber Brito Vasconcelos Filho
Manager Carlos Ferreira 23/04/2021

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());

Carlos Ferreira
Criador Kleber Brito Vasconcelos Filho 23/04/2021

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

 

Kleber Brito Vasconcelos Filho
Manager Carlos Ferreira 23/04/2021

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?

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!