API do Flask para fornecer arquivos JSON a um simples webapp HTML + JS + CSS, mantendo-o seguro

8

Eu fiz um webapp simples que mostra alguns dados em uma tabela, que serão atualizados semanalmente.

Essa atualização foi feita no back-end com algum código python, que raspa e altera alguns dados, antes de colocá-lo em um banco de dados SQLite.

Depois de fazer algumas leituras, aprendi que, para entregar esses dados ao meu aplicativo da web, eu deveria criar uma API com o Flask, que pode pegar esses dados e entregá-los ao JS no meu aplicativo da web no formato JSON, que pode usar os dados para preencher o mesa. No entanto, devo proteger minha API com nome de usuário e pw. Mas como é um front-end JS que recupera dados da API, não há realmente sentido, pois o nome de usuário e o pw terão que ser codificados no JS, que poderão ser lidos pelos usuários. (Eu acho que)

Devo expor minha API a todos, ou esse não é o caminho a seguir para poder usar dados SQLite como back-end para meu aplicativo da web? Eu estou bem mantendo a API apenas para um GET.

bjornasm
fonte
1
Seus usuários serão autenticados no site ao acessá-lo ou é algo como o google, onde qualquer pessoa pode acessar o site? Pessoalmente, nunca exporia uma API sem alguma forma de autenticação.
Daniel Butler
1
Esta resposta de Miguel parece responder suas perguntas em profundidade. Eu recomendo o autor que ele é bem versado em balão.
Daniel Butler
@DanielButler Obrigado por seus dois comentários. O site que tenho em mente é uma tabela que mostra um agregado de alguns dados já públicos. Vou ler o link, obrigado.
bjornasm

Respostas:

2

Você está correto, não faz sentido proteger sua API. A proteção de uma API é necessária apenas em determinadas circunstâncias.

Se você estiver acessando dados que não deseja que ninguém veja, talvez por meio de uma chamada de back-end, faria sentido adicionar alguma forma de segurança (normalmente uma chave de API ou tokens de autorização em seus cabeçalhos de solicitação).

No entanto, se você estiver fazendo chamadas do seu front-end (por exemplo, do lado do cliente) para uma API de back-end, não faz sentido colocar segurança adicional, pois o usuário já pode ver a solicitação e já tem acesso aos dados que a API está retornando. - então, protegendo você não está conseguindo nada.

Normalmente, se a página que o usuário está visitando contém dados confidenciais que você não deseja que todos vejam, você deve tomar medidas para proteger seu site (por exemplo, protegê-lo com um login para nome de usuário e senha antes de poder acessar essa página) . Se você seguir essa abordagem, em que o site é protegido por nome de usuário e senha, atualize a API para garantir que ela não responda às solicitações em que o usuário não está autenticado (por exemplo, gerando um token de sessão ou algo exclusivo para cada usuário conectado).

Se você der uma olhada nos sites que possuem muitos dados gratuitos disponíveis, descobrirá que todos eles têm chamadas de API de front-end completamente inseguras (porque não faz sentido se os dados já estiverem livres para acessar). Alguns sites tomam medidas para tentar garantir que é o próprio site que está chamando a API, mas mesmo assim é um pouco inútil, já que os scrappers da Web sempre podem extrair os dados do HTML.

KillerKode
fonte
1

Dê uma olhada nesta página que descreve os cabeçalhos de autenticação. Essa rota mais simples é codificar as informações do cabeçalho no Flask para torná-lo um pouco mais seguro. Você também pode tentar a rota mais envolvida de ler as informações do cabeçalho do seu banco de dados. O que está atualmente trabalhando para eu ler no postgres db está abaixo, para que você possa modificá-lo um pouco para o sqlite.

def valid():
  headers = request.headers
  auth = headers.get("X-Api-Key")
  user = User.query.filter_by(apikey=auth).first_or_404()
  print('from search of db ',user,'',auth)
  return str(user)
JC23
fonte
0
  1. Como você mencionou, planeja mostrar dados públicos - eles podem ser usados ​​mesmo sem autenticação. Caso contrário, acho que isso pode levar muito tempo desnecessário.
  2. Como você tem apenas uma tabela simples e única do banco de dados, acredito que você não precisa de uma API. Você pode criar um modelo HTML e renderizá-lo com dados. Alguns exemplos podem ser encontrados aqui e mais alguns aqui .
wowkin2
fonte