OAuth ist einer der am weitesten verbreiteten Standards für die Autorisierung des Zugriffs auf die Daten eines Benutzers von einem Server zu einem anderen Server im Internet. Es ist ein Protokoll, das es Benutzern ermöglicht, von Fall zu Fall Dritten Zugriff auf ihre Serverressourcen zu gewähren. OAuth 2.0 ist ein neuerer Standard, der einen sichereren und standardisierten Ansatz bietet. Aber wiederum hat einen Workflow, der komplizierter ist als der von OAuth 1.0, und daher kann es etwas schwierig sein, ihn selbst zu implementieren. Es gibt einige verschiedene OAuth 2.0-Autorisierungsabläufe. In diesem Tutorial erfahren Sie, wie Sie die Google-Anmeldung in der Flask-App implementieren.

Wir schauen uns zuerst an, was OAuth ist. Anschließend erfahren Sie, wie Sie die Google-Anmeldung in der Flask-App mit OAuthLib- und Requests-Bibliotheken implementieren.

Was ist OAuth?

OAuth ist ein standardisiertes Autorisierungsprotokoll, das Endbenutzern einen Prozess bietet, um in ihrem Namen den Zugriff Dritter auf ihre Serverressourcen zu autorisieren. OAuth stellt sicher, dass alle Beteiligten geschützt sind. OAuth wird häufig verwendet, um die Anmeldung von Drittanbietern bei Websites und Apps zu autorisieren. OAuth ist ein offener Standard, d. h. es kann frei verwendet und geändert werden. Es wurde als einfache Lösung für das komplizierte Autorisierungsproblem entwickelt. Das OAuth 2.0-Framework wurde entwickelt, um die Probleme der vorherigen Version zu beheben und Benutzern einen sicheren Autorisierungsmechanismus bereitzustellen.

Das Schöne an OAuth ist, dass es eigentlich keine Passwortdaten teilt, sondern Autorisierungstoken verwendet, um eine Identität zwischen Verbrauchern und Dienstanbietern nachzuweisen. Alle anderen Daten bleiben sicher verschlüsselt und der Token enthält nur die für die Autorisierung erforderlichen Informationen.

Voraussetzungen 

Rufen Sie die Google OAuth-Client-ID ab

Das Einrichten eines Kontos bei Google ist der erste Schritt, um deren Anmeldesysteme tatsächlich nutzen und in Ihre Anwendung integrieren zu können. Dies kann erreicht werden, indem Sie zur Entwicklerkonsole gehen, in der Sie aufgefordert werden, mehrere Felder auszufüllen und einige Bedingungen zu akzeptieren, bevor Sie eine Anwendung erstellen können.

Zunächst müssen Sie ein Google-Konto erstellen und Ihre Developer Console einrichten. Nur dann können Sie OAuth 2.0-Client-IDs erhalten.

Befolgen Sie diese Schritte, um Ihren neuen Satz von OAuth-Anmeldeinformationen zu erhalten:

  1. Gehen Sie zur Google Developer Console und erstellen Sie ein neues Projekt.
  2. Gehen Sie dann in der Seitenleiste zum Abschnitt APIs und Dienste und klicken Sie im Dropdown-Menü auf Anmeldeinformationen.
  1. Klicken Sie hier auf die Schaltfläche CREATE CREDENTIALS und wählen Sie dann den Abschnitt OAuth-Client-ID aus. (Wenn Sie zum ersten Mal eine OAuth-ID erstellen, werden Sie aufgefordert, einen Zustimmungsbildschirm zu konfigurieren, was Sie schnell tun können, indem Sie den Anweisungen auf der Website selbst folgen).
  1. Wählen Sie als Anwendungstyp Webanwendung aus und geben Sie ihr einen Namen. Fügen Sie dann die autorisierten Umleitungs-URIs hinzu, wir fügen nur den localhost-Link hinzu, da dies nur zu Testzwecken dient. Fügen Sie dort http://127.0.0.1:5000/callback ein.
  1. Wenn Sie fertig sind, klicken Sie auf die Schaltfläche Erstellen und der erstellte OAuth-Client sollte erstellt worden sein und Sie sollten Ihre Client-ID und Ihr Client-Geheimnis erhalten haben. 
  2. Laden Sie nun die JSON-Datei von dort herunter und bewahren Sie sie im selben Ordner wie die Datei auf, in der wir die Anwendung codieren, und ändern Sie ihren Namen in „client_sceret.json“.

Module besorgen

Es gibt viele Module, die Sie benötigen, um diesem Artikel zu folgen, aber einige davon sind wahrscheinlich bereits in einigen Systemen (wie Linux) installiert. In jedem Fall sollten Sie sie überprüfen/installieren, indem Sie den angegebenen Befehl ausführen.

Um Zeit zu sparen, können Sie eine Datei namens requirements.txt erstellen und die folgende Liste darin einfügen und dann alles auf einmal installieren, anstatt sie einzeln zu installieren.

Flask==1.1.2
google-auth==1.27.0
google-auth-oauthlib==0.4.2
oauthlib==3.1.0pathlib==1.0.1vendor==0.1
requests==2.25.1
requests-oauthlib==1.3.0

Führen Sie den Befehl aus, um alle Module gleichzeitig zu installieren:

pip install -r requirements.txt

Lassen Sie uns unsere App schreiben

OAuth 2.0 ist ein immer beliebteres Authentifizierungsprotokoll, und obwohl die OAuth 2.0-Spezifikation sehr kompliziert sein mag, ist das Protokoll unkompliziert und viel einfacher als die Erstellung eines eigenen Benutzerauthentifizierungssystems. Diese Skripts veranschaulichen die Interaktion, die zum Abrufen und Verwenden von OAuth 2.0-Zugriffstoken erforderlich ist.

Wir können damit beginnen, alle benötigten Module zu importieren. Ich habe auch alles kommentiert, was Sie über den Code wissen müssen. Sie können auch überprüfen, ob an dieser Stelle alles installiert ist und funktioniert.

#app.py
import os
import pathlib
import requests
from flask import Flask, session, abort, redirect, request
from google.oauth2 import id_token
from google_auth_oauthlib.flow import Flow
from pip._vendor import cachecontrol
import google.auth.transport.requests

Nach erfolgreichem Import der Module können wir mit der Implementierung des Google OAuth 2.0 Logins in unserem Projekt beginnen.

app = Flask("Google Login App")  #naming our application
app.secret_key = "GeekyHuman.com"  #it is necessary to set a password when dealing with OAuth 2.0
os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"  #this is to set our environment to https because OAuth 2.0 only supports https environments

GOOGLE_CLIENT_ID = "<your_client_id>"  #enter your client id you got from Google console
client_secrets_file = os.path.join(pathlib.Path(__file__).parent, "client_secret.json")  #set the path to where the .json file you got Google console is

flow = Flow.from_client_secrets_file(  #Flow is OAuth 2.0 a class that stores all the information on how we want to authorize our users
    client_secrets_file=client_secrets_file,
    scopes=["https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email", "openid"],  #here we are specifing what do we get after the authorization
    redirect_uri="http://127.0.0.1:5000/callback"  #and the redirect URI is the point where the user will end up after the authorization
)

Nach dem Hinzufügen des obigen Codes zur Datei können wir dann damit beginnen, unsere Funktionen und Seiten zu erstellen, um unsere Ergebnisse anzuzeigen.

def login_is_required(function):  #a function to check if the user is authorized or not
    def wrapper(*args, **kwargs):
        if "google_id" not in session:  #authorization required
            return abort(401)
        else:
            return function()

    return wrapper


@app.route("/login")  #the page where the user can login
def login():
    authorization_url, state = flow.authorization_url()  #asking the flow class for the authorization (login) url
    session["state"] = state
    return redirect(authorization_url)


@app.route("/callback")  #this is the page that will handle the callback process meaning process after the authorization
def callback():
    flow.fetch_token(authorization_response=request.url)

    if not session["state"] == request.args["state"]:
        abort(500)  #state does not match!

    credentials = flow.credentials
    request_session = requests.session()
    cached_session = cachecontrol.CacheControl(request_session)
    token_request = google.auth.transport.requests.Request(session=cached_session)

    id_info = id_token.verify_oauth2_token(
        id_token=credentials._id_token,
        request=token_request,
        audience=GOOGLE_CLIENT_ID
    )

    session["google_id"] = id_info.get("sub")  #defing the results to show on the page
    session["name"] = id_info.get("name")
    return redirect("/protected_area")  #the final page where the authorized users will end up


@app.route("/logout")  #the logout page and function
def logout():
    session.clear()
    return redirect("/")


@app.route("/")  #the home page where the login button will be located
def index():
    return "Hello World <a href='/login'><button>Login</button></a>"


@app.route("/protected_area")  #the page where only the authorized users can go to
@login_is_required
def protected_area():
    return f"Hello {session['name']}! <br/> <a href='/logout'><button>Logout</button></a>"  #the logout button 


if __name__ == "__main__":  #and the final closing function
    app.run(debug=True)

Nachdem wir den gesamten angegebenen Code in einer Datei hinzugefügt haben, müssen wir die JSON-Datei, die wir von der Entwicklerkonsole erhalten haben, und die mit dem Code „app.py“ im selben Ordner ablegen. Und es ist geschafft!

Ausgabe

Um nun die Ergebnisse zu sehen, geben Sie im folgenden Befehl im Terminal die Anwendung ein:

python app.py  #Windows
python3 app.py  #Linux/Mac

Und wenn die Anwendung erfolgreich gestartet wurde, sollte sie in etwa so aussehen:

Gehen Sie nun zu dem angegebenen Link, der http://127.0.0.1:5000/ lautet, und Sie sollten eine Seite wie diese erhalten:

Wie Sie sehen können, erscheint unser Login-Button auf der Seite. Versuchen Sie, darauf zu klicken, und wir werden zur Google-Authentifizierungsseite weitergeleitet, die ungefähr so ​​​​aussehen würde:

Melden Sie sich mit Ihrem Konto an und Sie werden auf die Rückrufseite weitergeleitet, die Sie intern auf die Seite „protected_area“ weiterleitet. Und so sieht es aus:

Letzte Worte

In diesem Artikel haben wir darüber gesprochen, wie OAuth funktioniert, und Beispiele dafür gegeben, wie es implementiert wird. Wir haben Ihnen auch einige Ressourcen bereitgestellt, die Ihnen helfen können, OAuth besser zu verstehen, damit Sie fundiertere Entscheidungen über die Verwendung in Ihren Anwendungen treffen können. Aber das ist noch lange nicht das Ende, es gibt noch viel Raum für Verbesserungen, wie das Hinzufügen besserer Sicherheit, mehr Anmeldemöglichkeiten, das Hinzufügen von Vorlagen zum Code und vieles mehr, was hier getan werden kann. Sie können auch sehr leicht Dokumentationen für dieses Zeug finden, daher würde ich Ihnen empfehlen, diese zu überprüfen. Wir hoffen, dass dieser Artikel darüber informiert, wie Sie die Google-Anmeldung in der Flask-App implementieren.

Hier sind einige nützliche Tutorials, die Sie lesen können: