Flask API para proporcionar archivos JSON a una aplicación web HTML + JS + CSS simple mientras la mantiene segura

8

He creado una aplicación web simple que mostrará algunos datos en una tabla, que se actualizará semanalmente.

Esta actualización se realizó en el backend con algún código de Python, que raspa y altera algunos datos, antes de ponerlo en una base de datos SQLite.

Después de leer un poco, aprendí que para entregar esos datos a mi aplicación web debería hacer una API con Flask, que puede tomar esos datos y entregarlos al JS en mi aplicación web en forma de JSON, que luego puede usar los datos para llenar el mesa. Sin embargo, debería asegurar mi API con nombre de usuario y pw. Pero como es una interfaz JS que recuperará datos de la API, realmente no tiene sentido, ya que el nombre de usuario y pw tendrán que estar codificados en JS, que luego podrán leer los usuarios. (Yo creo que)

¿Debo exponer mi API a todos, o no es este el camino para poder utilizar los datos de SQLite como back-end para mi aplicación web? Estoy bien manteniendo la API solo para GET.

bjornasmo
fuente
1
¿Sus usuarios se autenticarán en el sitio web cuando accedan a él o es algo así como google donde cualquiera puede ir al sitio? Personalmente, nunca expondría una API sin alguna forma de autenticación.
Daniel Butler
1
Esta respuesta de Miguel parece responder a sus preguntas en profundidad. Le recomiendo al autor que esté bien versado en el matraz.
Daniel Butler
@DanielButler Gracias por tus dos comentarios. El sitio que tengo en mente es una tabla que muestra un agregado de algunos datos ya públicos. Te leeré el enlace, gracias.
bjornasm

Respuestas:

2

Tienes razón, no tiene sentido proteger tu API. Asegurar una API solo es necesario en ciertas circunstancias.

Si está accediendo a datos que no desea que nadie vea, tal vez a través de una llamada de back-end, entonces tendría sentido agregar alguna forma de seguridad (normalmente una clave API o tokens de autorización en sus encabezados de solicitud).

Sin embargo, si realiza llamadas desde su front-end (es decir, del lado del cliente) a una API de back-end, entonces no tiene sentido poner seguridad adicional allí ya que el usuario ya puede ver la solicitud y ya tiene acceso a los datos que la API está devolviendo - así que al asegurarlo no estás logrando nada.

Normalmente, si la página que visita el usuario contiene datos confidenciales que no desea que todos vean, debería tomar medidas para proteger su sitio web (por ejemplo, protegerlo con un inicio de sesión para nombre de usuario y contraseña antes de poder acceder a esa página) . Si tuviera que adoptar este enfoque, donde el sitio web está protegido por nombre de usuario y contraseña, puede actualizar la API para asegurarse de que no responda a solicitudes en las que el usuario no está autenticado (por ejemplo, generando un token de sesión o algo único para cada usuario registrado).

Si echa un vistazo a los sitios web que tienen una gran cantidad de datos gratuitos disponibles, encontrará que todos tienen llamadas API de front-end que son completamente inseguras (porque no tiene sentido si los datos ya son de libre acceso). Algunos sitios web toman medidas para tratar de asegurarse de que sea su propio sitio web el que llama a la API, pero aun así es un poco inútil ya que los scrappers web siempre pueden extraer los datos del HTML.

KillerKode
fuente
1

Eche un vistazo a esta página que describe los encabezados de autenticación. Esta ruta más simple es codificar la información del encabezado en Flask para hacerlo un poco más seguro. También puede probar la ruta más complicada de leer la información del encabezado de su base de datos. Lo que actualmente funciona para mí para leer de postgres db está a continuación, por lo que puede modificarlo ligeramente para 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
fuente
0
  1. Como mencionó, planea mostrar datos públicos; luego, se pueden usar incluso sin autenticación. De lo contrario, creo que puede tomar demasiado tiempo innecesario dedicado a eso.
  2. Como solo tiene una tabla simple y única de la base de datos, creo que no necesita una API. Simplemente puede crear una plantilla HTML y representarla con datos. Algunos ejemplos se pueden encontrar aquí y algunos más aquí .
wowkin2
fuente