Flask-API zum Bereitstellen von JSON-Dateien für eine einfache HTML + JS + CSS-Webanwendung, während diese sicher bleibt

8

Ich habe eine einfache Webanwendung erstellt, die einige Daten in einer Tabelle anzeigt, die wöchentlich aktualisiert wird.

Dieses Update wurde im Backend mit Python-Code durchgeführt, der einige Daten kratzt und ändert, bevor sie in eine SQLite-Datenbank gestellt werden.

Nachdem ich etwas gelesen hatte, erfuhr ich, dass ich zum Übermitteln dieser Daten an meine Webanwendung eine API mit Flask erstellen sollte, die diese Daten in Form von JSON an die JS in meiner Webanwendung übermitteln kann, die dann die Daten zum Auffüllen der Daten verwenden kann Tabelle. Ich sollte meine API jedoch mit Benutzername und pw sichern. Da es sich jedoch um ein JS-Frontend handelt, das Daten von der API abruft, macht es keinen Sinn, da der Benutzername und pw in JS fest codiert werden müssen, das dann von den Benutzern gelesen werden kann. (Ich glaube)

Sollte ich meine API allen zugänglich machen, oder ist dies nicht der richtige Weg, um SQLite-Daten als Backend für meine Webanwendung verwenden zu können? Ich bin in Ordnung, die API nur auf einem GET zu halten.

bjornasm
quelle
1
Werden Ihre Benutzer beim Zugriff auf die Website authentifiziert oder handelt es sich um Google, bei dem jeder auf die Website zugreifen kann? Persönlich würde ich niemals eine API ohne irgendeine Form der Authentifizierung verfügbar machen.
Daniel Butler
1
Diese Antwort von Miguel scheint Ihre Fragen eingehend zu beantworten. Ich kann dem Autor nur empfehlen, dass er sich mit Kolben gut auskennt.
Daniel Butler
@ DanielButler Vielen Dank für Ihre beiden Kommentare. Die Site, an die ich denke, ist eine Tabelle, die eine Zusammenfassung einiger bereits öffentlicher Daten zeigt. Ich werde dich Link lesen, danke.
Björnasm

Antworten:

2

Sie haben Recht, es ist sinnlos für Sie, Ihre API zu sichern. Das Sichern einer API ist nur unter bestimmten Umständen erforderlich.

Wenn Sie auf Daten zugreifen, die niemand sehen soll, möglicherweise über einen Backend-Aufruf, ist es sinnvoll, eine Sicherheitsfunktion hinzuzufügen (normalerweise einen API-Schlüssel oder Autorisierungstoken in Ihren Anforderungsheadern).

Wenn Sie jedoch von Ihrem Front-End (dh der Client-Seite) aus eine Back-End-API aufrufen, ist es sinnlos, dort zusätzliche Sicherheit zu schaffen, da der Benutzer die Anforderung bereits sehen kann und bereits Zugriff auf die von der API zurückgegebenen Daten hat - Wenn Sie es sichern, erreichen Sie nichts.

Wenn die Seite, die der Benutzer besucht, vertrauliche Daten enthält, die nicht jeder sehen soll, würden Sie normalerweise stattdessen Schritte unternehmen, um Ihre Website zu schützen (z. B. indem Sie sie mit einem Login für Benutzername und Passwort schützen, bevor Sie auf diese Seite zugreifen können). . Wenn Sie diesen Ansatz wählen, bei dem die Website durch Benutzername und Kennwort geschützt ist, können Sie die API aktualisieren, um sicherzustellen, dass sie nicht auf Anforderungen reagiert, bei denen der Benutzer nicht authentifiziert ist (z. B. indem Sie ein Sitzungstoken oder etwas Einzigartiges für generieren jeder angemeldete Benutzer).

Wenn Sie sich auf Websites umschauen, auf denen viele kostenlose Daten verfügbar sind, werden Sie feststellen, dass alle über Front-End-API-Aufrufe verfügen, die vollständig ungesichert sind (da es sinnlos ist, wenn auf die Daten bereits frei zugegriffen werden kann). Einige Websites unternehmen Schritte, um sicherzustellen, dass die API von ihrer eigenen Website aufgerufen wird, aber selbst dann ist dies etwas sinnlos, da Web-Scrapper die Daten immer aus dem HTML-Code extrahieren können.

KillerKode
quelle
1

Schau es dir an diese Seite an, auf der die Authentifizierungsheader aufgeführt sind. Diese einfachere Methode besteht darin, die Header-Informationen in Flask hart zu codieren, um sie etwas sicherer zu machen. Sie können auch die aufwändigere Methode zum Lesen von Header-Informationen aus Ihrer Datenbank ausprobieren. Was derzeit für mich funktioniert, um aus postgres db zu lesen, ist unten, so dass Sie es für sqlite leicht ändern können.

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
quelle
0
  1. Wie Sie bereits erwähnt haben, möchten Sie öffentliche Daten anzeigen - diese können dann auch ohne Authentifizierung verwendet werden. Ansonsten kann es meiner Meinung nach zu viel unnötige Zeit in Anspruch nehmen.
  2. Da Sie nur eine einfache und einzelne Tabelle aus der Datenbank haben, glaube ich, dass Sie keine API benötigen. Sie können einfach eine HTML-Vorlage erstellen und mit Daten rendern. Einige Beispiele finden Sie hier und einige weitere hier .
wowkin2
quelle